【问题标题】:Pop to root then perform segue on iPhonePop to root 然后在 iPhone 上执行 segue
【发布时间】:2013-01-03 06:03:15
【问题描述】:

我在启用 iOS 6.0 故事板时运行

我有一个链接到 TableViewController 的 NavController。 这个 TableView 可以 segue 到 AViewController 或 BViewController。

当我在 A 中时,我想弹回根目录并使用此行对 B 执行 segue :

UINavigationController *nav = self.navigationController;
[nav popToRootViewControllerAnimated:YES];
[nav performSegueWithIdentifier:@"GoToB" sender:self];

我检查了故事板,GoToB 确实存在,并且从 TableViewController 链接到 BViewController

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<NavMainViewController: 0xb921fa0>) has no segue with identifier 'GoToB''

我错过了什么?

【问题讨论】:

    标签: iphone ios uinavigationcontroller storyboard uistoryboardsegue


    【解决方案1】:

    segue 将附加到您弹出的视图控制器,而不是 nav,后者是包含它的容器视图控制器。所以这会更接近:

    UINavigationController *nav = self.navigationController;
    [nav popToRootViewControllerAnimated:YES];
    
    UIViewController *rootVC = [nav.viewControllers objectAtIndex:0];
    [rootVC performSegueWithIdentifier:@"GoToB" sender:self];
    

    但是,我认为这里的问题是 pop 动画会与 segue 冲突。使用 ...Animated:NO 进行 pop 可能会修复它,但我认为从 rootVC 执行 segue 会更正确(并且对动画更健壮)。

    rootVC 将按如下方式实现 viewDidAppear:

    - (void)viewDidAppear:(BOOL)animated {
    
        [super viewDidAppear:animated];
        if (!self.isBeingPresented && /* any other condition that makes you want this */) {
            [self performSegueWithIdentifier:@"GoToB" sender:self];
        }
    }
    

    【讨论】:

    • 在您的第二个示例中:如何向 rootVC 发送消息?是否有类似可解析数据绑定到视图控制器而不是使用标签?
    • 好吧,我创建了一个变量,我把它放在一个单例中,希望它是解析数据的好方法。
    • 是rootVC不知道要不要segue的问题吗?您始终可以通过查看导航控制器的 viewControllers 堆栈中的第一个 vc 来获取实例。也许给它一个属性?但通常当你发现自己需要这样做(或单例)时,这意味着你的模型缺少一些 vcs 应该检查的状态。
    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2014-09-21
    相关资源
    最近更新 更多