【问题标题】:Stacking multiple UIViewControllers and presenting the last one in UINavigationController stack堆叠多个 UIViewController 并在 UINavigationController 堆栈中显示最后一个
【发布时间】:2014-09-09 23:14:36
【问题描述】:

这里的请求可能很简单,但我找不到解决方案,而且它困扰了我好几天。

我正在构建简单的选项页面,用户可以在其中跳转到所需的页面,并且我正在使用UINavigationController 实例来管理层次结构。我的storyboard 看起来像这样:

视图控制器与在下一个按钮上触发的push segues 连接,而我将[self.navigationController popViewControllerAnimated:YES] 用于上一个按钮。例如,如果我通过 push segue 将 5VC 上标记为 2 的按钮与 2VC 连接,我会进入第二页,但如果我想使用上一个按钮,我将进入选项页面或 5VC,这是我没有的想。相反,我希望能够使用上一个按钮转到第一页,而在第二页。

我看到的方式,如果我在第三页 (3VC) 并且我调用选项页 (5VC) 并选择按钮 3,系统应该堆叠 1VC-2VC 并呈现 3VC,所以我可以去 2VC通过[self.navigationController popViewControllerAnimated:YES] 请求。

我认为解决方案与setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated 有某种联系,但我不知道如何使事情起作用的语法。

【问题讨论】:

    标签: objective-c ios7 uinavigationcontroller xcode5 uistoryboard


    【解决方案1】:

    你有 3 个案例

    用推回到中间的祖先之一

    案例5VC=>2VC,5VC=>3VC:

    NSArray *vcs = self.navigationController.viewControllers;
    for(NSInteger i = vcs.count - 2; i > 0; i--) {
    
        // find the target and its parent view controller
        // i.e. class of 2VC is ViewController2
        if([vcs[i] isKindOfClass:[ViewController2 class]]) {
            UIViewController *target = vcs[i];
            UIViewController *parent = vcs[i - 1];
    
            // pop to its parent view controller with NO animation
            [self.navigationController popToViewController:parent animated:NO];
    
            // push the target from its parent
            [self.navigationController pushViewController:target animated:YES];
    
            return;
        }
    }
    

    使用 push 返回根视图控制器

    案例 5VC=>1VC:

    UIViewController *root = self.navigationController.viewControllers.firstObject;
    
    // reset view controllers stack with self as root. 
    [self.navigationController setViewControllers:@[self] animated:NO];
    
    // push target from self
    [self.navigationController pushViewController:root animated:YES];
    
    // reset navigation stack with target as root.
    [self.navigationController setViewControllers:@[root] animated:NO];
    

    从一个祖先那里推新的 VC

    案例 5VC=>4VC

    NSArray *vcs = self.navigationController.viewControllers;
    for(NSInteger i = vcs.count - 1; i >= 0; i--) {
    
        // find the parent view controller
        if([vcs[i] isKindOfClass:[ViewController3 class]]) {
            UIViewController *parent = vcs[i];
    
            // pop to the parent with NO animation 
            [self.navigationController popToViewController:parent animated:NO];
    
            // perform segue from the parent
            [parent performSegueWithIdentifier:@"push4VC" sender:self];
            return;
        }
    }
    

    在你的情况下(5VC=>4VC),你知道3VC是自己的父母,你可以直接得到父母:

    NSArray *vcs = self.navigationController.viewControllers;
    UIViewController *parent = vcs[vcs.count - 2]; // [vcs.count-1] is self.
    [self.navigationController popToViewController:parent animated:NO];
    [parent performSegueWithIdentifier:@"push4VC" sender:self];
    

    【讨论】:

    • 非常感谢。如果我使用模态搜索而不是 push 从 3VC 到 options (5VC) 并且最重要的是返回,你能告诉我代码会是什么样子吗?基本上,我很难先实现关闭模式视图(关闭模式 5VC),然后再弹回一些视图控制器......比方说,3VC。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多