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

时间:2014-01-13 19:45:07

标签: ios uinavigationcontroller uisplitviewcontroller

我有这个UISplitViewController,主要和详细的VC都是UINavigationController子类。 这两者应该“同步”工作,即,当一个人推动一个新VC时,第二个也必须推动一个。当一个人弹出时,另一个人也必须弹出。一个人总是会对另一个人采取同样的行动。

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

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

我想到的另一个解决方案是覆盖UINavigationController的{​​{1}},使一个类弹出另一个类,就像这样:

- popViewControllerAnimated:

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

实现理想行为的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

对于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 
  }
}

答案 1 :(得分:0)

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

基本上你需要两个UINavigationController的子类,一个用于主,一个用于细节。

在两个子类中,您必须包含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:,现在当我弹出我的观点时,没有任何不好的事情发生。