假设我有两个uiviewcontroller在一个UINavigationController的堆栈上。在"父级"中,我们称之为"自我"。navigationController pushViewController:childViewController animated:YES];"在一些用户操作上,在"子"中我们称之为"[self.]navigationController popViewControllerAnimated:YES];"基于某些用户操作。
我们如何在父元素中识别我们刚刚返回的元素?
是否有一些"事件"驱动的方法可以识别这个popViewControllerAnimated动作是从子调用的?
看起来你正在使用这个子控制器作为模态,因为它可以被'驳回'。如果是这种情况,尝试遵循苹果的模式,他们使用的UIAlertViews。
如果是这种情况,我将执行以下两种方法之一来实现委托模式(委托与块是一个巨大的争论,我不会在这里讨论),以便所有者(推动子进程的人)知道它何时被解散:
- 创建一个协议(ChildControllerDelegate),其中有一个方法childcontrollerwasresolved:(ChildController *)
- 添加一个block属性(确保它是copy属性,而不是retain)到ChildController
你会想在viewDidDisappear上调用委托方法或block。如果你想要更细粒度的控制,有一个委托方法或块对应viewWillDisappear/viewDidDisappear.
我通过设置navigationController?.delegate = self
,然后实现这个方法来确定当前视图控制器是否在弹出后再次显示,从而成功地解决了这个问题。
func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
if viewController == self {
// we got back
} else {
// some other controller was pushed
}
}
有几种方法可以暗示这一点。你能做的是从父类调用popViewControllerAnimated。你可以通过将一个块传递给子控制器来实现这一点,然后子控制器将执行所述块,因此弹出将由父控制器完成。
你也可以使用UINavigationController委托来通知当一个UIViewController将被解散:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
这个方法将让你知道哪个VC将被显示,你可以检查当前(尚未弹出)的VC是否是你正在寻找的子VC。
您也可以使用- (void)viewWillAppear:来做一些技巧,但这可能需要一些技巧
先读一下,它会帮助你理解视图控制器是怎么回事。
然后在父视图控制器中实现viewWillAppear:
和viewDidAppear:
来记录消息