15

假设我在 UINavigationController 中的堆栈上有 2 个 UIViewController。在“父”中我们调用“[self.navigationController pushViewController:childViewController animated:YES];” 在某些用户操作和“孩子”中,我们调用“[self.navigationController popViewControllerAnimated:YES];” 根据一些用户操作。

我们如何才能在父母内部认识到我们刚刚回来?

是否有一些“事件”驱动的方法可以识别出这个 popViewControllerAnimated 动作是从孩子那里调用的?

4

4 回答 4

6

似乎您正在将此子控制器用作模式,因为它可以被“解雇”。如果是这种情况,请尝试遵循他们用于 UIAlertViews 的 Apple 模式。

如果是这种情况,我会执行以下任一操作来实现委托模式(委托与块是一个巨大的辩论,我不会在这里讨论)所以所有者(推动孩子前进的人)知道它何时被解雇:

  • 创建一个协议(ChildControllerDelegate),其中有一个方法 childControllerWasDismissed:(ChildController *)
  • 向 ChildController 添加一个块属性(确保它是一个复制属性,而不是保留)

然后,您需要调用委托方法或阻止 viewDidDisappear。如果您想要更精细的控制,请使用与 viewWillDisappear / viewDidDisappear 对应的委托方法或块。

于 2011-08-02T14:28:39.097 回答
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
        }
    }
于 2016-04-06T07:05:45.490 回答
1

有几种方法可以暗示这一点。您可以做的是从父级调用 popViewControllerAnimated。您可以通过将传递给子控制器来执行此操作,然后子控制器将执行所述块,因此弹出将由父控制器完成。

您还可以使用 UINavigationController 委托在 UIViewController 将被解除时收到通知:

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

此方法将让您知道将显示哪个 VC,并且您可以检查当前(尚未弹出)VC 是否是您正在寻找的孩子。

您还可以使用 - (void)viewWillAppear: 做一些技巧:但这可能需要一些技巧。

于 2011-08-02T14:02:32.197 回答
0

First read this, it will help you understand what is going on with view controllers.

Then implement viewWillAppear: and viewDidAppear: in your parent view controller to log a message.

于 2011-08-02T14:01:12.207 回答