gpt4 book ai didi

iphone - viewWillAppear,viewDidAppear 没有被调用,没有触发

转载 作者:IT老高 更新时间:2023-10-28 11:47:01 27 4
gpt4 key购买 nike

(这既是问题又是答案,因为需要大量挖掘才能找到真正的答案。)

症状:viewWillAppearviewDidAppear 没有在我的 UIViewController 中被调用。

原因:在 UIViewController 中嵌入 UINavigationControllerUITabBarController(我的情况)会以某种方式中断这些方法的调用。

解决方法:在包含上述UINavigationController/UITabBarControllerUIViewController中手动调用。

例如(假设 projectNavigationController 是你的 UINavigationController):

-(void)viewWillAppear:(BOOL)animated {    [super viewWillAppear:animated];    [projectNavigationController viewWillAppear:animated];}-(void)viewWillDisappear:(BOOL)animated {     [super viewWillDisappear:animated];    [projectNavigationController viewWillDisappear:animated];}-(void)viewDidAppear:(BOOL)animated {     [super viewDidAppear:animated];    [projectNavigationController viewDidAppear:animated];}-(void)viewDidDisappear:(BOOL)animated {     [super viewDidDisappear:animated];    [projectNavigationController viewDidDisappear:animated];}

在我的情况下,我有一个内部 UITabBarController,我相应地调用了方法,一切都解决了。

(解决方案的归属:http://davidebenini.it/2009/01/03/viewwillappear-not-being-called-inside-a-uinavigationcontroller/)

最佳答案

我将继续不同意@St3fan,并使用 UIKit 作为反例。

然而,嵌入 Controller 的智慧(或缺乏智慧)通常应该以健全的 UI 设计原则为指导。

最简单的反例是嵌入在 UITabBarControllers 中的 UINavigationControllers。这些无处不在。就在我的脑海中,iPhone 上的 iPod 应用程序和 iPhone 上电话应用程序中的联系人。

我很好奇,想检查他们对 View 做了什么(添加到“ super Controller ” View 或 UIWindow。我很确定我会发现子 Controller View 是 View 层次结构中 super Controller View 的后代,这与 St3fan 的建议相反。

我创建了一个非常快速的 iPhone 应用程序,将所有内容都连接到 InterfaceBuilder 中,以创建一个基于 UITabBarController 的应用程序,其中包含两个选项卡,其中第一个是一个带有普通标签的 UINavigationController ole UIViewController 作为它的 Root View Controller ,以及带有普通旧 UIViewController 的第二个选项卡,所以我有一个稍后可以单击的第二个选项卡。

添加一些 NSLog 语句来为我们看到的 Controller 输出各种 UIView's:

tabBarController.view = <UILayoutContainerView: 0x5b0dc80; ...
navigationController.view = <UILayoutContainerView: 0x59469a0; ...
rootViewController.view = <UIView: 0x594bb70; ...
Superview: <UIViewControllerWrapperView: 0x594cc90; ...
Superview: <UINavigationTransitionView: 0x594a420; ...
Superview: <UILayoutContainerView: 0x59469a0; ... // navigationController.view
Superview: <UIViewControllerWrapperView: 0x594b430; ...
Superview: <UITransitionView: 0x5b0e110; ...
Superview: <UILayoutContainerView: 0x5b0dc80; ... // tabBarController.view
Superview: <UIWindow: 0x5942a30; ...

以“Superview”为前缀的行是沿着 rootViewController.view 的 superview 链向上直到达到 nil 的输出。

当然,快速浏览一下在 Root View Controller 上会调用 viewDidDisappear 的几个地方的调用堆栈。

首先,在根 Controller 上调用 viewDidDisappear 时的调用堆栈,因为新 Controller 被压入堆栈:

-[RootController viewDidDisappear:]
-[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:]
...

二、在最顶层的UITabBarController中选择另一个tab时的调用栈:

-[RootController viewDidDisappear:]
-[UINavigationController viewDidDisappear:]
-[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:]

因此,在所有情况下,Apple 似乎决定 Controller 应该在其嵌入式子 Controller 上调用各种 viewDidAppear 等方法,并且应该以类似方式嵌入 View 。我认为如果我们要采用 UIKit 设计作为一个很好的引导,那么 OP 就一针见血了。

关于iphone - viewWillAppear,viewDidAppear 没有被调用,没有触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3560669/

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