在iPhone上的UISplitViewController: 从详细视图控制器返回/显示主视图

24

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

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

现在我有一个问题,如果我想从新的视图控制器返回到主视图控制器,该怎么办?

[self.navigatonController popToRootViewControllerAnimated:YES];

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

您有任何想法应该如何做到这一点吗?

4个回答

41

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

这是Swift语言中的代码(包含在详细视图控制器中的某个位置):

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

我宁愿不透露我在这上面浪费了多少时间。非常感谢你,这对我非常有效。 - Clifton Labrum
谢谢,伙计!救命稻草! - Karoly Nyisztor
哈-利-路-尔。这不是显而易见的。 - pulse4life

10

我在苹果开发者论坛上找到了一个解决方案: 如何在iPhone的UISplitViewController中手动“pop”回MasterViewController

旧的(也许仍然有效)建议是让Master视图启动“pop”。为此,详细视图需要通知主视图自定义按钮的按下。这可以通过定义协议来实现,其中主视图是委托,详细视图具有名为“delegate”的变量。当主视图推送详细视图时,它将此委托变量设置为self。现在详细视图有一个挂钩来通知主视图。

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

(子)详细视图控制器:

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

[primary popToMaster];

主视图控制器:

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

1
更简单的方法是,您可以通过以下方式替换Detail VC方法: UINavigationController *navCon = [self.splitViewController.viewControllers objectAtIndex:0]; [navCon popViewControllerAnimated: YES]; - Frederic Adda
此外,在这种情况下,似乎没有必要实际定义协议并将MasterVC设置为DetailVC的代理,因为您可以通过[self.splitViewController.viewControllers objectAtIndex:0]直接获取到primaryVC的navController。太棒了! - Frederic Adda

1
这个解决方案对我在iPhone上有效。我使用UINavigationViewController作为UISplitViewController的详细视图控制器。据我所知,detailViewController.navigationController?.popToRootViewController(animated: true)不能正常工作的原因是导航控制器的根视图控制器不是主视图控制器。分割视图控制器是我的详细视图控制器(UINavigationController)的“导航控制器”。我调用这个以弹出到主视图控制器:
detailViewController.navigationController?.navigationCont
roller.popToRootViewController(animated: true)

0

我有完全相同的问题! 据我所知,splitViewController在iPhone上“折叠”时看起来像是一个navigationController,但是detailVC实际上不再与masterVC在同一个导航堆栈中。这就是为什么你的“popToRootViewController”消息不再起作用的原因。

目前为止,我还没有找到解决方法。如果我找到了解决方案,我会告诉你的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接