【问题标题】:How to know when a UIViewController view is shown after being in the background?如何知道在后台后何时显示 UIViewController 视图?
【发布时间】:2010-12-14 20:23:24
【问题描述】:

iOS4.2/iPhone4中

  • 单击图标启动应用程序(一些视图 显示控制器视图)
  • 点击 iPhone Home 按钮(返回 主屏幕)
  • 双击主页按钮
  • 从以下位置选择以前启动的应用程序 选择

现在我可以看到我的应用程序委托在最后一步被选中时会收到一条消息“applicationDidBecomeActive”,但我的 viewController(当前显示的视图)如何知道?

viewDidLoad 已被调用,因此不再调用。 viewWillLoad 不再被调用。

似乎无法弄清楚。我问的原因是我想检查是否进行了任何设置更改,但想在视图控制器中执行此操作,因为这是关心的事情。

【问题讨论】:

    标签: iphone uiviewcontroller


    【解决方案1】:

    答案在这里:Handling applicationDidBecomeActive - "How can a view controller respond to the app becoming Active?"

    使用NSNotificationCenter 在您的视图控制器中获得UIApplicationDidBecomeActiveNotification 事件的通知。

    【讨论】:

    • @fraggle 这看起来是最可靠的解决方案。请考虑将其标记为您问题的答案。
    【解决方案2】:

    在你的 appDelegate applicationDidBecomeActive 中输入:

    - (void)applicationDidBecomeActive:(UIApplication *)application
    {
        UINavigationController *navc = (UINavigationController *)[tabBarController selectedViewController];
    
        UIViewController *topvc = [navc topViewController];
    
        if ([topvc respondsToSelector:@selector(viewControllerDidBecomeActive)]) 
        {
            [topvc performSelector:@selector(viewControllerDidBecomeActive)];
        }
    }
    

    这将获取在屏幕上看到的 viewController。你只需要在每个 viewControllers 上实现 viewControllerDidBecomeActive ;)

    【讨论】:

    • 对,那种作品,但不是我想要的。我的视图层次结构有点复杂,所以你发布的代码不会按原样工作,但我明白了,我可以那样做。所以它绝对是一种方法。我想我希望我错过了一些东西,并且有一种更直接的方法,它独立于一个视图控制器层次结构。
    • 几年后的今天,但 AFAICS 最好的选择是使用 NSNotificationCenter。
    【解决方案3】:

    在 appDelegate applicationDidBecomeActive 中设置一个布尔属性标记它刚刚从背景中出现。

    然后在您的视图控制器中,特别是在 viewDidAppear 覆盖中,检查 appDelegate 属性,如果它为 true,则您知道它来自后台,否则它只是正常显示。顺便说一句,为了整洁,将布尔属性设置为 false。

    编辑- 除非您重新创建导航堆栈,否则您必须在 applicationDidBecomeActive 中手动调用 viewDidAppear。如果您能够获得指向当前可见视图控制器的指针,那么调用 viewDidAppear 应该是一种简单的方法,因为所有视图控制器都有这个方法。您不需要任何代表等。

    【讨论】:

    • 好吧,那不行。视图已经出现。然后有人去更改一些设置,然后他们回到应用程序。通常在 iOS 4 上,viewDidAppear 不会再次被调用,对吧?
    • 对不起你的权利!我忘记了在我的应用程序中我正在对 applicationDidBecomeActive 中的导航堆栈执行操作。如果您有一个指向当前可见视图控制器的指针,那么您可以在视图中调用一个函数,告诉它检查是否有任何更改,但这与 Thomas 的答案基本相同,但没有委托的优雅。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多