检测导航控制器内容变化但忽略导航控制器本身的 hiding/showing

Detect navigation controller content changes but ignore hiding/showing of the navigation controller itself

我是应用程序主导航控制器的 UINavigationControllerDelegate。我想知道我的导航控制器显示的视图控制器何时会更改,以及何时更改。我目前使用这些委托方法来查找:

// Called when the navigation controller shows a new top view controller via a push, pop or setting of the view controller stack.
optional func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool)
optional func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool)

不幸的是,导航控制器包含在带有滑出菜单的视图控制器中。菜单控制器调用主视图控制器上的外观转换方法,因此它在显示菜单时接收 viewWillDisappear,在隐藏菜单时接收 viewWillAppear/viewDidAppear。导航控制器中包含的视图依靠这些事件来了解它们何时可见。

viewWillAppear 在导航控制器本身上触发时,它会向我调用 navigationController:willShowViewController:。当 viewDidAppear 在导航控制器上触发时,它会调用 navigationController:didShowViewController:.

有什么方法可以区分呈现不同内容视图控制器的导航控制器和显示的导航控制器本身吗?

我认为您可以通过子class导航控制器并添加您在 viewWillAppear 中设置的 BOOL 属性 来完成此操作,

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.willBeAppearing = YES;
}

在委托中,勾选这个属性,在didShowViewController:方法中将其设置为NO,如果当前为YES,

-(void)navigationController:(RDNavController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (navigationController.willBeAppearing == NO) {
        NSLog(@"The controller is changing");
        // Do what you need to do when a new controller is about to appear
    }
}


-(void)navigationController:(RDNavController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (navigationController.willBeAppearing == NO) {
        NSLog(@"The controller has changed");
        // Do what you need to do when a new controller has appeared
    }else{
        navigationController.willBeAppearing = NO;
    }
}

请注意,我将委托方法中传入的导航控制器的 class 更改为我的自定义 class。