【问题标题】:popToRootViewControllerAnimated not always firing viewWillAppear in rootViewControllerpopToRootViewControllerAnimated 并不总是在 rootViewController 中触发 viewWillAppear
【发布时间】:2014-03-25 22:56:33
【问题描述】:

我的应用程序处理打开电子邮件附件。为了在我的AppDelegate 中执行此操作,我将我的专用 ViewController 称为我的应用程序的RootViewController,这要感谢popToRootViewControllerAnimated:

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

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

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

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

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

【问题讨论】:

    标签: ios objective-c uiviewcontroller xcode5


    【解决方案1】:

    听起来是因为在案例 1 中,在您的应用程序的上下文中,您的 RootViewController 已经“可见”,因此 popToRootViewController 不需要做任何事情。

    【讨论】:

      【解决方案2】:

      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 的侦听器

      【讨论】:

        【解决方案3】:

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

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

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

        并在

        中实现你想要的
        - (void)willEnterForeground:(NSNotification *)notification
        

        不要忘记停止观察 RootViewController 何时会被释放:

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

        【讨论】:

        • 您的解决方案听起来不错,但如何知道RootViewController 何时会被释放? didReceiveMemoryWarning 方法何时被触发?
        猜你喜欢
        • 2018-01-07
        • 2012-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多