UIViewController viewDidAppear - 因为它被推或者因为子视图被弹出了?

时间:2011-12-21 14:30:05

标签: iphone uiviewcontroller viewdidappear

在我的应用程序中,我有大约十几个不同的视图控制器,按不同的顺序推入或弹出堆栈。当一个视图出现时(我正在使用viewDidAppear方法)我需要确定这是否是因为这个视图刚刚被压入堆栈,或者因为它的一个子视图是从堆栈弹出的。

我经历了这个问题:viewWillDisappear: Determine whether view controller is being popped or is showing a sub-view controller

但我不认为这对我很有帮助。有什么建议吗?

3 个答案:

答案 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