在我的应用程序中,我有大约十几个不同的视图控制器,按不同的顺序推入或弹出堆栈。当一个视图出现时(我正在使用viewDidAppear
方法)我需要确定这是否是因为这个视图刚刚被压入堆栈,或者因为它的一个子视图是从堆栈弹出的。
但我不认为这对我很有帮助。有什么建议吗?
答案 0 :(得分:4)
如果你可以管理它,最好的解决方案就是尝试修改你的代码,这样无论控制器是刚刚被推动还是只是弹出它的子节点都无关紧要。从根本上说,视图控制器在其视图和应用程序运行的数据之间进行调解。只要该数据是最新的,控制器就不应该关注其视图出现之前发生的事情。控制器当前根据应用程序的先前状态执行的任务(例如更新数据)可能更适合位于不同的类中。
如果您使用的是故事板,另一种可能性是依靠-prepareForSegue:sender:
代替-viewDidAppear
。您在该方法中传递的segue具有标识源和目标视图控制器的属性,这通常足以告诉您控制器如何成为当前控制器。
如果这些都不适用于您的情况,请考虑将配置代码移动到一个或多个不同的方法。您面临的问题的根源是-viewWillAppear
并不意味着您需要它。创建一个 表示您需要的方法,例如-childControllerFinished
,并使用 来执行您需要的配置工作。
答案 1 :(得分:1)
你可以做的是在你的视图控制器上有一个BOOL属性,称为alreadyPushed或类似的东西。然后在viewDidAppear方法中检查它是否为false(它将是第一次调用viewDidAppear),如果它被设置为true。
然后,当弹出子视图viewController时,viewDidAppear方法将检查是否已将alreadyPushed属性设置为true,如果您知道刚刚弹出了子视图。
答案 2 :(得分:0)
如果将视图控制器压入堆栈,将调用它的viewDidLoad
方法;如果弹出它的子控制器,则不调用viewDidLoad
。
- (void)viewDidLoad {
[super viewDidLoad];
//do any setup you want to do only when the view is pushed onto the
//stack for the first time; this method will not be called
//when the view's subview is popped and this one becomes visible
}
因此,首次推送视图控制器时,使用viewDidLoad
(或initWithNibName
,具体取决于您正在做的事情)进行一次性设置,并{{1}对于您要执行每次时间视图显示的设置。使用UINavigationController,您可能希望在UINavigationControllerDelegate协议中实现这两个方法:
viewDidAppear