popToRootViewControllerAnimated并不总是在rootViewController中触发viewWillAppear

时间:2014-02-24 10:28:46

标签: ios objective-c uiviewcontroller xcode5

我的应用程序处理打开电子邮件附件。要在我的AppDelegate中执行此操作,请使用RootViewController调用我的专用ViewController,这是我的应用的popToRootViewControllerAnimated:

我在RootViewController的viewWillAppearviewDidAppear中进行了一些处理,但如果在切换到邮件应用程序之前显示的视图控制器是我的RootViewController,则不会调用它们。

案例1:未调用常用viewWillAppear / viewDidAppear方法: (RootViewController - >切换到Mail App - >在我的应用中打开附件 - >在AppDelegate中popToRootViewControllerAnimated - > RootViewController)

案例2:通常的viewWillAppear / viewDidAppear方法被调用: (OtherViewController - >切换到Mail App - >在我的应用中打开附件 - >在AppDelegate中popToRootViewControllerAnimated - > RootViewController)

在互联网上找到这个技巧,但它在案例1中不起作用:http://www.idev101.com/code/User_Interface/UINavigationController/viewWillAppear.html

如何解决此问题并始终调用常用的viewWillAppear / viewDidAppear方法?

3 个答案:

答案 0 :(得分:0)

听起来是因为在案例1中,在您的应用程序的上下文中,您的RootViewController已经“可见”,因此popToRootViewController无需执行任何操作。

答案 1 :(得分:0)

仅当相对于您的应用程序发生此类事件时,才会调用

viewWillAppear:viewDidAppear:方法。在应用程序之间切换时,不会调用这些方法。您应该依赖于appDelegate中的applicationWillEnterForeground:applicationDidBecomeActive:方法。

还有一点需要注意的是,当你在做什么时

RootViewController -> popToRootViewControllerAnimated -> RootViewController

您的根视图控制器视图已经可见,因此它不会触发viewWillAppear:viewDidAppear:方法。

我建议你做类似的事情

RootViewController.m

-(void)viewDidAppear:(BOOL)animated
{
   [self doSomething];
}

-(void)doSomething
{
   //Your functionality
}

AppDelegate.m

- (void)applicationDidBecomeActive:(UIApplication *)application
{
   [self.window.rootViewController doSomething];
}

您还可以将根视图控制器添加为UIApplicationDidBecomeActiveNotificationUIApplicationWillEnterForegroundNotification

的监听器

答案 2 :(得分:0)

您的视图控制器已经可见,因此无法调用viewWillAppear是正常的。

如果您想知道用户何时返回您的应用,只需在RootViewController init方法中添加以下代码:

  [[NSNotificationCenter defaultCenter] addObserver:self 
                                       selector:@selector(willEnterForeground:)
                                           name: UIApplicationWillEnterForegroundNotification
                                         object:nil];

并在

中实现您想要的内容
- (void)willEnterForeground:(NSNotification *)notification

不要忘记在取消分配RootViewController时停止观察:

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}