iOS:了解在导航推送后何时加载两个视图控制器的最佳实践

时间:2018-08-05 19:49:04

标签: ios objective-c uinavigationcontroller delegates

我有一个iOS应用程序,可以显示多个屏幕,并且对于iPhone和iPad具有不同的根控制器。这是一个简化的示例代码,以显示正在发生的事情。

if (iPad) {
    self.sideMenuController = [LGSideMenuController sideMenuControllerWithRootViewController:viewControllerA
                                                        leftViewController:viewControllerB
                                                        rightViewController:nil];   
} else {
    self.sideMenuController = [LGSideMenuController sideMenuControllerWithRootViewController:viewControllerB
                                                        leftViewController:viewControllerA
                                                        rightViewController:nil];   
  }

 [self.navigationController pushViewController:self.sideMenuController animated:NO];

我需要知道两个控制器(ViewControllerA和ViewControllerB)何时加载。

我已经实现了以下代表

   - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
        if (self.viewControllerA.viewIfLoaded.window != nil && self.viewControllerB.viewIfLoaded.window != nil) {
           // do stuff after both controllers have been loaded and it is current view.
        }
    }

委托解决方案有效,但不确定是否是最佳实践。我检查viewControllerAviewControllerB是否不是nil和当前的视图控制器,因为我将其他控制器推入了导航控制器,并且在发生这种情况时不想做任何事情。

3 个答案:

答案 0 :(得分:1)

似乎很脆弱。您正在做很多假设,而不是(据我所知)向导航控制器询问您真正想知道答案的问题。这个问题是(据我所知):

  • 是刚被推入VCA和VCB之一的视图控制器吗?
  • 该对的 other 已经是导航控制器的孩子了吗?

答案 1 :(得分:0)

您可以拥有两个viewController都继承自的一些BaseClass(ViewControllerA和ViewControllerB),并且在该BaseClass中,您可以使用doc_root方法来运行所需的任何代码。

答案 2 :(得分:0)

假设始终先加载根视图控制器,则可以使用非根视图控制器的viewDidLoad方法执行工作,该方法可以通过引用设备类型来确定。