- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
(这既是问题又是答案,因为需要大量挖掘才能找到真正的答案。)
症状:viewWillAppear
、viewDidAppear
没有在我的 UIViewController 中被调用。
原因:在 UIViewController
中嵌入 UINavigationController
或 UITabBarController
(我的情况)会以某种方式中断这些方法的调用。
解决方法:在包含上述UINavigationController
/UITabBarController
的UIViewController
中手动调用。
例如(假设 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/
从后台返回到我的 iPhone 应用程序后,未调用方法 viewDidAppear。 有没有人能解决这个问题? 每次显示我的 MainViewController 时(即使从后台返回后),我都需要调用
我想在出现特定选项卡时执行某些操作。意思是,用户单击了选项卡 View 的选项卡按钮。发生这种情况时 viewDidAppear 不会触发。我还能如何 Hook 选项卡单击事件? 最佳答案 你可以实现
当用户启动应用程序时,我希望它显示 stockholm.xib它在这里: -(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:a
当前遇到一个问题,我在使用显示转场到单独的弹出 View 后尝试更新我的 View 。初始 viewDidAppear 在加载时被触发,但是在我关闭其他 View 并转换回另一个 View 后,它不会
我的想法是这个 View 何时出现。我想让它按位置检测。所以如果用户在新加坡。新加坡细胞将被重点关注。有什么办法可以实现吗?我确实看到了这个功能,但不知道如何使用 didHighlightRowAtI
我有一个 UItextview,我可以在里面写入数据类,我可以在我的 View 中的任何地方提供数据,在 ViewDidAppear 函数中我传递了我的数据,但它有点慢。文本在 0.2-0.3 秒后出
我有 2 个 View Controller ,vc1 和 vc2。当我想加载 vc2 时,从 vc1 调用模态转场。假设我在显示 vc2 时将应用程序置于后台。当应用程序重新打开到之前关闭的 Vie
我正在我的应用程序的 viewDidApepar 中对一个带有动画的方法进行简单调用, Storyboard中动画 View 的初始位置是 (10 , 5) - 几乎隐藏在主视图之外。 -(void)
我遇到了一些非常奇怪的情况。 我的代码看起来像这样: - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBund
在我的代码中,我有一个 viewWillAppear 调用,类似于下面的调用,旨在将某些对象移开。 override func viewWillAppear(_ animated: Bool) {
我有一个 HomeViewController 正在使用 segue 打开一个 WelcomeViewController 并且来自 Sheet 类型。 在 WelcomeViewController
我正在尝试为两个文本字段和一个标签创建动画幻灯片。然而,出于某种原因,每次您尝试单击文本字段时,viewDidAppear() 函数都会运行,导致它们继续动画。有人有什么想法吗? 这是我的函数代码:
我注意到当按下主屏幕然后再次启动时,viewDidAppear 没有被调用。这就是为什么在我按下主页按钮然后再次启动我的应用程序后我的动画停止工作的原因。有什么办法可以解决这个问题吗? overrid
我设置了一个 void如果用户触摸按钮,则从另一个类调用该方法。但是,我收到“其 View 不在窗口层次结构中”的错误,然后我发现了这个:whose view is not in the window
背景:我想确保我的 viewControllers 在出现时正确旋转。我的 viewControllers 有很好的代码来管理可见时的旋转和方向。 问题:给定 NavigationController
我遵循了这个指南: https://codewithchris.com/iphone-app-connect-to-mysql-database/#app 我在覆盖功能上遇到了这个问题: Argume
如果我有一个名为 B 的 UIViewController。如果我将 UIViewController C 添加为 B 的 subview / subview Controller 。然后我也将 D
是否有标志指示 viewDidAppear 已被调用? 我想我可以在子类化的 UIViewController 中创建我自己的标志,但我想知道是否已经有了一些东西。 我问的原因是因为我想在某些服务器端
在我的主 UIViewController 中,我添加了一个主屏幕 View Controller 作为 subview : UINavigationController *controller
首先,我创建了一个 MainViewController。然后在 MainViewController 中,我做 [self presentViewController:modalViewContro
我是一名优秀的程序员,十分优秀!