【问题标题】:UISplitViewController on iPhone: pop to / show primary view from detail view controlleriPhone上的UISplitViewController:从详细视图控制器弹出/显示主视图
【发布时间】:2014-12-22 18:54:58
【问题描述】:

我正在使用新的 iOS 8 UISplitViewController。如果我在 iPhone 上运行它,我会遇到以下问题:

我的主视图控制器触发一个细节视图控制器来显示。详细视图控制器将新的视图控制器推送到详细视图中的 UINavigationController 堆栈。

如果我想从新的视图控制器弹回主视图控制器,现在我遇到了问题。

我该怎么做

[self.navigatonController popToRootViewControllerAnimated:YES];

不起作用。 我想在 iPhone 上显示主视图控制器。所以我必须弹出两个视图。

有什么想法可以做到这一点吗?

【问题讨论】:

    标签: ios objective-c iphone ios8


    【解决方案1】:

    UIViewControllers 有一个“splitViewController”属性,因此您可以通过它获取对适当导航控制器的引用 - 然后调用 popViewControllerAnimated。

    它在 Swift 中(包含在细节视图控制器的某处):

    if let navController = splitViewController?.viewControllers[0] as? UINavigationController {
        navController.popViewControllerAnimated(true)
    }
    

    【讨论】:

    • 我不想透露我为此浪费了多少时间。非常感谢——这对我很有用。
    • 谢谢,朋友!救命稻草!
    • Hal-le-lu-ur。这并不明显。
    【解决方案2】:

    我刚刚在 Apple Developer Forum 上找到了一个解决方案: How to manually 'pop' back to MasterViewController in UISplitViewController on iPhone

    旧的(也许仍然有效)建议是让 Master 视图启动“弹出”。为了做到这一点,详细视图需要 通知主视图有关按下自定义按钮的信息。这个可以 通过定义一个协议来实现,其中主视图是 委托和详细视图有一个名为“委托”的变量。什么时候 主推它设置这个委托变量的详细视图 自己。现在细节视图有一个钩子来通知主视图。

    这意味着从(子)详细视图控制器调用主视图控制器方法:

    (子)详细视图控制器:

    UINavigationController *navCon = [self.splitViewController.viewControllers objectAtIndex:0];
    MyPrimaryViewController *primary = [navCon.viewControllers objectAtIndex:0];
    
    [primary popToMaster];
    

    主视图控制器:

    - (void)popToMaster
    {
        [self.navigationController popViewControllerAnimated:YES];
    }
    

    【讨论】:

    • 为了更简单,您可以将 Detail VC 方法替换为: UINavigationController *navCon = [self.splitViewController.viewControllers objectAtIndex:0]; [navCon popViewControllerAnimated: YES];
    • 另外,在这种情况下,看起来不需要实际定义协议并将 MasterVC 设置为 DetailVC 的委托,因为您可以直接获取 primaryVC 的 navController通过 [self.splitViewController.viewControllers objectAtIndex:0]。无论如何,太棒了!
    【解决方案3】:

    此解决方案适用于我在 iPhone 上。我使用 UINavigationViewController 作为 UISplitViewController 的详细视图控制器。据我所知原因 detailViewController.navigationController?.popToRootViewController(animated: true) 不起作用是因为导航控制器的根视图控制器不是主视图控制器。拆分视图控制器是我的 detailViewController (UINavigationController) 的“导航控制器”。 我称之为 pop 到主视图控制器:

    detailViewController.navigationController?.navigationCont
    roller.popToRootViewController(animated: true)
    

    【讨论】:

      【解决方案4】:

      我也有同样的问题! 据我了解,splitViewController“看起来”像iPhone上的navigationController(“折叠”splitVC),但detailVC实际上不再与masterVC在同一个导航堆栈上。这就是为什么您的“popToRootViewController”消息不再起作用的原因。

      暂时还没有找到办法。如果我找到解决方案,我会告诉你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-14
        • 2016-07-18
        • 2014-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多