【问题标题】:iOS: Best practice to know when two view controllers are loaded after navigation pushiOS:了解导航推送后何时加载两个视图控制器的最佳实践
【发布时间】:2019-01-12 19:53:05
【问题描述】:

我有一个 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.
        }
    }

委托解决方案有效,但不确定它是否是最佳做法。我检查 viewControllerA 和 viewControllerB 是否不是 nil 和当前视图控制器,因为我在导航控制器中推送其他控制器并且如果发生这种情况不想做任何事情。

【问题讨论】:

  • 我只是好奇:navigationController.viewControllers.contains(viewControllerA) && navigationController.viewControllers.contains(viewControllerB) 不会在这里工作吗?
  • 如果我们再推另一个视图控制器呢?你会接到同样的电话,并且条件会通过,但是这两个都不是刚刚被推动的。可以接受吗。这似乎有点脆弱。
  • 这很好。如果确实通过了新控制器(我的应用程序现在不这样做,但将来可以),则条件将通过。我想知道是否有办法解决这个问题。
  • 另外,navigationController.viewControllers.contains(viewControllerA) 也不起作用。导航控制器确实知道它包含self.sideMenuController。

标签: ios objective-c uinavigationcontroller delegates


【解决方案1】:

假设根视图控制器总是首先加载,您可以在非根视图控制器的viewDidLoad方法中执行工作,您可以通过引用设备类型来确定。

【讨论】:

  • 这就是我最终的结果。
【解决方案2】:

您可以拥有两个 viewControllers 都继承自(ViewControllerA 和 ViewControllerB)的 BaseClass,并且在该 BaseClass 中,您可以使用 viewDidLoad: 方法来运行您想要的任何代码。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 是的,这些都是我要问的问题。但是,不确定是否可以通过此委托。委托在推送视图控制器之后。我只想在导航控制器完成推送后做某些事情。
    • 好吧,这又是一个 x-y 问题。你仍然没有问如何做你想做的事。再一次,您刚刚选择了一个“解决方案”(导航委托方法和一些特定代码)并询问“这是怎么回事?”
    • 我只需要知道在使用导航控制器推送后两个视图控制器何时加载。然后,需要调用一些方法(仅一次)。我尝试了委托解决方案,但您指出了我没有想到的缺陷(特别是如果我推送更多控制器会怎样)。我最初认为委托解决方案会起作用,但似乎它存在可能导致方法被多次调用的缺陷。
    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多