UISplitViewController - 弹出细节时弹出主控(反之亦然)

Posted

技术标签:

【中文标题】UISplitViewController - 弹出细节时弹出主控(反之亦然)【英文标题】:UISplitViewController - Pop master when detail is popped (and vice versa) 【发布时间】:2014-01-13 19:45:06 【问题描述】:

我有这个UISplitViewController,它的主VC和细节VC都是UINavigationController的子类。 两者应该“同步”工作,即当一个推新的 VC 时,第二个也必须推一个。当一个弹出时,另一个也必须弹出。一个总是对另一个触发相同的操作。

我已经能够处理问题的推送部分,因为推送功能在我使用的每个类中都是显式的。

另一方面,弹出是一个大问题。当用户按下后退按钮时触发该操作,我不知道如何检测此事件。一种可能的解决方案是检测事件。

我想到的另一个解决方案是覆盖UINavigationController- popViewControllerAnimated:,让一个类弹出另一个类,就像这样:

// On DetailNav
- (UIViewController *)popViewControllerAnimated:(BOOL)animated 
  // Code to make MasterNav pop

  return [super popViewControllerAnimated:animated];


// On MasterNav
- (UIViewController *)popViewControllerAnimated:(BOOL)animated 
  // Code to make DetailNav pop

  return [super popViewControllerAnimated:animated];

我没有费心添加完整的代码,因为这足以注意到这种方法会导致无限循环,最终将两个 NavController 弹出到它们的根(然后可能崩溃)。

实现所需行为的最佳方法是什么?

【问题讨论】:

【参考方案1】:

对于 ios 5+,- (BOOL)isMovingFromParentViewController 可以解决问题:

// Use this in the detail VC
- (void)viewWillDisappear:(BOOL)animated 
  [super viewWillDisappear:animated];

  if (self.isMovingFromParentViewController) 
    // the view is being popped. 
    // so also pop the master VC 
  

【讨论】:

不会像以前一样陷入循环吗?因为如果我从 Master 中弹出,Detail 控制器将在您的代码中输入 if 语句,对吗?【参考方案2】:

我在@Chrizzz's answer 上找到了另一个问题的解决方案。

基本上你需要UINavigationController的两个子类,一个是master,一个是detail。

在两个子类中,您必须包含 UINavigationBarDelegate 并将委托设置为 self .然后包含以下方法:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item 
  [[[[self splitViewController] viewControllers][0 or 1] navigationController] performSelector:@selector(popViewControllerAnimated:) withObject:@YES afterDelay:0];
  return YES;

在主目录中,您需要弹出详细信息 VC,因此在索引上放置 1。在详细信息中,您需要弹出主 VC ,所以在索引上放一个 0

此解决方案允许您在弹出视图控制器之前运行例程。

更新 我遇到了一些 NavigationBar 错误,例如 nested pop animation can result in corrupted navigation bar。因此,我没有直接调用popViewControllerAnimated:,而是以零延迟调用performSelector:,现在当我弹出我的视图时,没有什么不好的事情发生。

【讨论】:

以上是关于UISplitViewController - 弹出细节时弹出主控(反之亦然)的主要内容,如果未能解决你的问题,请参考以下文章

UISplitViewController iOS 5.1 导致弹出箭头方向错误

UISplitViewController 在菜单弹出框可见的情况下旋转时缩小左侧

为啥弹出嵌套在 UISplitViewController 中的 UINavigationController 的控制器会为整个 splitView 设置动画?

在弹出窗口中显示 UISplitViewController

自定义 UISplitViewController?

UISplitViewController 重新加载数据