【问题标题】:ObjectiveC: Add/Perform multiple segue in navigation controller目标 C:在导航控制器中添加/执行多个 segue
【发布时间】:2019-10-25 13:03:31
【问题描述】:

我正在实现一个应用程序功能,它有 6-7 个屏幕流入。用户可以在任何屏幕上离开/关闭流程。

但是当用户再次申请申请时,他们应该跳转到他离开的最后一个屏幕,并且他可以返回到之前的屏幕。

例如:我开始申请并完成到第 4 个屏幕并关闭。再次申请,我必须直接跳转到第 4 个屏幕,并且还能够从堆栈返回到第 3->2->1 个屏幕。

当前代码:

Storyboard 中 1-7 屏幕的 Segue 标识符是“screen1”、“screen1”...“screen7”

来自 HomeScreen.m

-(void)toPersonalApplication {

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Personal" bundle:nil];
    ScreenOne *screenOne = [storyboard instantiateViewControllerWithIdentifier:@"screenOne"];
    UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:screenOne];
    [self presentViewController:nav animated:YES completion:nil];
}

检查用户是否已经启动了一个应用进程:

在 ScreenOne.m

   - (IBAction)btnNextClick:(id)sender {

        if (doneProcessTill == 4) {

        // Should be execute something like this here
        // [self performSegueWithIdentifier:@"screen2" sender:self];
        // [self performSegueWithIdentifier:@"screen3" sender:self];
        // [self performSegueWithIdentifier:@"screen4" sender:self];
      }

    }

感谢您的建议! 谢谢

【问题讨论】:

  • 您应该在主屏幕中检查进度并在此处设置导航控制器的视图控制器(不带 segues)。

标签: ios objective-c uinavigationcontroller segue


【解决方案1】:

对于这种情况,最好保存您的视图控制器,然后在您想回到原来的位置时再次显示它们。在任何时候,您都可以使用navigationController.viewControllers 获取当前的视图控制器。要设置整个堆栈,您只需在导航控制器上调用 setViewControllers

您可以覆盖导航控制器来存储控制器数组。或者你可以静态保存它。哪个对你来说更方便。

静态的看起来像这样:

static NSArray<UIViewController *> *__preservedControllers = nil;

@implementation ViewController

- (void)onClose {
    __preservedControllers = self.navigationController.viewControllers;
    // Insert logic to close the whole procedure
}

- (void)reopenSavedStack {
    if(__preservedControllers) {
        [self.navigationController setViewControllers:__preservedControllers animated:YES];
        __preservedControllers = nil;
    }
}

使用子类化导航控制器,它可能看起来更好:

@interface MyNavigationController : UINavigationController

@property (nonatomic, strong) NSArray<UIViewController *> *savedStack;

@end

@implementation MyNavigationController

- (void)saveStack {
    self.savedStack = self.viewControllers;
}

- (void)restoreStack:(BOOL)animated {
    if(self.savedStack.count > 0) {
        [self setViewControllers:self.savedStack animated:YES];
        self.savedStack = nil;
    }
}

@end

但是您确实需要进行类型转换:

- (void)onClose {
    [(MyNavigationController *)self.navigationController saveStack];
    // Insert logic to close the whole procedure
}

- (void)reopenSavedStack {
    [(MyNavigationController *)self.navigationController restoreStack:YES];
}

【讨论】:

    【解决方案2】:

    正如我在评论中所述,解决方案可能如下所示:

    - (void)toPersonalApplication {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Personal" bundle:nil];
    
        NSMutableArray *viewControllers = [NSMutableArray array];
        for (NSInteger i = 1; i <= doneProcessTill; ++i) {
            UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:[NSString stringWithFormat:@"screen%ld", (long)i]];
            [viewControllers addObject:viewController];
        }
    
        UINavigationController *navigationController = [UINavigationController new];
        navigationController.viewControllers = viewControllers;
    
        [self presentViewController:navigationController animated:YES completion:nil];
    }
    

    【讨论】:

      猜你喜欢
      • 2019-01-21
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多