gpt4 book ai didi

ios - 将 View Controller 插入导航 Controller 后,不会触发 viewDidLoad(和 loadView)

转载 作者:可可西里 更新时间:2023-11-01 05:04:38 26 4
gpt4 key购买 nike

viewController 的 View 不会在 viewController 被插入导航 Controller 后立即加载。

这是我的代码片段。

- (void)myMethodInClassA {
// window's root view controller is navigation controller
UINavigationController *naviCtrl = (UINavigationController*)[UIApplication sharedApplication].keyWindow.rootViewController;
MyViewController *myVC = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[naviCtrl pushViewController:myVC animated:NO];

// at this point, myVC's view is NOT loaded
}

当我调用 myMethodInClassA 时,myVC 的 viewDidLoad 在该方法返回后被调用。我预计 myVC 的 View 会在导航 Controller 的 pushViewController:animated: 被调用之后和 myMethodInClassA 返回之前加载。

究竟什么时候加载 View Controller 的 View ? Apple 的文档只是说它在第一次访问时加载。这有点模棱两可。为什么导航 Controller 的 pushViewController: 不能访问 View Controller 的 View ?

附注抱歉最初的模棱两可的问题。

最佳答案

将 View Controller (VC) 压入导航 Controller 的堆栈会使 VC 成为导航 Controller (容器 View Controller )的 subview Controller 。创建这样的父子关系是一个独特的步骤,它不会立即加载子 VC 的 View 。相反,容器 VC 会在稍后加载 View 。我相信对于“稍后”的含义没有明确的规范——通常是在容器 VC 决定将子 VC 的 View 集成到容器 VC 的 View 层次结构中的时候。但基本上它只是由容器 VC 的实现自行决定发生。

也就是说,任何人 都可以通过简单地访问 VC 的 view 属性来强制加载 VC 的 View 。例如,在您的代码中,您可以添加这一行

myVC.view;

这将触发 loadView,然后触发 MyViewController 中的 viewDidLoad

但是,在您的情况下,如果 MyViewController 需要对它已与容器 VC 相关联的事件使用react,那么最好重写以下方法中的一个(或两个?)在 MyViewController 中:

- (void) willMoveToParentViewController:(UIViewController*)parent
{
// write your code here
}

- (void) didMoveToParentViewController:(UIViewController*)parent
{
// write your code here
}

不过,您需要注意,willMoveToParentViewControllerdidMoveToParentViewController 也会在 MyViewController 从其父级导航 Controller 堆栈中弹出时调用。您可以通过检查 nilparent 参数来检测这种情况。

关于ios - 将 View Controller 插入导航 Controller 后,不会触发 viewDidLoad(和 loadView),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16849189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com