iOS:如何识别我们从父UIViewController中的子UIViewController返回



假设我有两个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:来记录消息

相关内容

  • 没有找到相关文章

最新更新