【问题标题】:How to call method when app enters foreground from background应用程序从后台进入前台时如何调用方法
【发布时间】:2014-07-07 14:06:43
【问题描述】:

当我的应用从后台进入前台时,有没有一种简单的方法来调用方法?我让我的程序在 viewDidLoad 方法中调用了一个方法“nowYouSeeMe”,这在第一次运行应用程序时效果很好。当我使用该应用程序然后点击主页按钮时,它会像往常一样移至后台。现在,当我按下应用程序图标并将其带到前台时,我基本上希望它再次调用 nowYouSeeMe 方法。

-(void)nowYouSeeMe{
  NSLog(@"I'm back");
}

有什么想法吗??

【问题讨论】:

    标签: ios methods viewdidload foreground


    【解决方案1】:

    正如已经提到的,在 App Delegate 中有 - (void)applicationDidBecomeActive:(UIApplication *)application;,但大多数时候您需要的信息不是在您的应用委托中,而是在您的视图控制器中。因此您可以使用NSNotificationCenter。在您的应用委托中,您可以执行以下操作:

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center postNotification:[NSNotification notificationWithName:@"appDidEnterForeground" object:nil]];
    

    现在您可以在UIViewControllers 设置代码中设置监听器:

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center addObserver:self selector:@selector(appDidEnterForeground) name:@"appDidEnterForeground" object:nil];
    

    现在,每当应用进入前台时,都会在您的视图控制器上调用 appDidEnterForeground方法。

    但是您甚至不需要自己发布通知,因为它已经在 UIApplication.xml 中定义了。如果您向下滚动文档 (UIApplication Class Reference),您会看到在 UIApplication.h 中声明的所有通知,在您的情况下为 UIApplicationWillEnterForegroundNotification。 请注意UIApplicationWillEnterForegroundUIApplicationDidEnterForeground之间的区别,但大多数时候您想使用UIApplicationWillEnterForeground,只是为了设置所有内容并在应用显示时做好准备。

    当然,您应该在某处为您的通知名称定义一个常量,如果您不再需要观察者,请将其删除。

    编辑:你也可以在你的问题中使用@selector(nowYouSeeMe),错过了

    【讨论】:

    • 这行得通,谢谢! AppDelegate.m -> - (void)applicationDidBecomeActive:(UIApplication *)application { NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [中心 postNotification:[NSNotification notificationWithName:@"appDidEnterForeground" object:nil]];并到 ViewController viewDidLoad this -> NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(nowYouSeeMe) name:@"appDidEnterForeground" object:nil];
    • 监听方法不调用@iCaramba
    【解决方案2】:

    在 appDelegate 中有一个名为 applicationDidBecomeActive:(UIApplication *)application 的方法,它会在您的应用激活时触发。

    【讨论】:

      【解决方案3】:

      尝试通过以下应用委托方法调用该方法:

      - (void)applicationDidBecomeActive:(UIApplication *)application;
      

      【讨论】:

        【解决方案4】:

        您应该在 AppDelegate 中实现 applicationWillEnterForeground: 方法,如下所示:

        - (void)applicationWillEnterForeground:(UIApplication *)application
        {
            [self.controller nowYouSeeMe];
        }
        

        前提是您在 AppDelegate 中有对该控制器的引用作为属性。

        【讨论】:

          【解决方案5】:

          根据其他人的回答,应用程序代表将通过applicationDidBecomeActive: 获得呼出。

          应用程序还将发布UIApplicationDidBecomeActiveNotification 通知。因此,任何不是应用委托的人都可以观察到这一点。

          如果可以避免的话,您不应该将应用程序委托用作懒惰的做所有事情的单例;如果它是一个特定的视图控制器,它只在它处于活动状态并且应用程序返回前台时才想做某事,那么就没有理由涉及应用程序委托 - 这是视图控制器的一种行为,而不是应用程序。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多