iOS:如何在父视图控制器中识别我们从子视图控制器返回?

15
假设我有两个UIViewControllers在UINavigationController堆栈中。在“父级”中,我们在某些用户操作时调用“[self.navigationController pushViewController:childViewController animated:YES];”,在“子级”中,我们在某些用户操作时调用“[self.navigationController popViewControllerAnimated:YES];”。
如何在父级中识别我们刚刚回来了?
是否有一种“事件”驱动的方法可以识别此popViewControllerAnimated操作是从子级调用的?
4个回答

6
看起来你正在将这个子控制器用作模态,因为它可以被“dismissed”(取消显示)。如果是这样的话,请尝试遵循苹果在 UIAlertViews 中使用的模式。
如果是这种情况,我建议执行以下操作之一以实现委托模式(delegate vs block 是一个巨大的争论,我不会在这里讨论)以便所有者(推送子项的人)知道何时被取消显示:
- 创建一个协议(ChildControllerDelegate),其中有一个方法 childControllerWasDismissed:(ChildController *) - 添加一个块属性(确保它是 copy 属性,而不是 retain)到 ChildController 然后,您需要在 viewDidDisappear 上调用委托方法或块。如果您想要更精细的控制,请添加一个与 viewWillDisappear / viewDidDisappear 相对应的委托方法或块。

4

我通过设置navigationController?.delegate = self并实现以下方法成功地解决了这个问题,以确定当前视图控制器在弹出后是否再次显示。

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
        if viewController == self {
            // we got back
        } else {
            // some other controller was pushed
        }
    }

1

有几种方法可以暗示这一点。你可以从父控制器中调用popViewControllerAnimated。你可以通过向子控制器传递一个block来实现这一点,然后执行该块,从而由父控制器完成弹出操作。

你也可以使用UINavigationController代理,在UIViewController将被解除显示时得到通知:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;

这个方法可以让你知道哪个VC将会被显示,你可以检查当前(尚未弹出)的VC是否是你正在寻找的子VC。

你也可以在 - (void)viewWillAppear: 中做一些小技巧,但这可能需要一些hack。


0

首先阅读this,它将帮助您了解视图控制器的工作原理。

然后在您的父视图控制器中实现viewWillAppear:viewDidAppear:以记录消息。


1
然而,这并没有告诉你哪个其他控制器已经被弹出。可能存在几个不同的控制器。但当然不会同时处于推送状态,因此操作员可以简单地跟踪最后一个被推送的控制器是哪个。 - Björn Marschollek

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