【问题标题】:iOS: Refresh Data When App is Brought to ForegroundiOS:当应用程序被带到前台时刷新数据
【发布时间】:2013-05-17 21:03:45
【问题描述】:

我通过 JSON 从服务器获取数据并将其显示在标签上。 我已经在 viewDidLoad 中添加了该方法。

我想在用户再次打开应用时刷新数据。目前,即使我在模拟器中杀死应用程序并重新启动应用程序,它也不会刷新。

我尝试了 viewDidAppear 方法,但由于某种原因它没有被执行。

-(void)viewDidAppear{
        NSLog(@"Called viewDidAppear");
}

这永远不会被调用。我尝试最小化应用程序,但没有成功。

【问题讨论】:

    标签: ios viewdidload viewdidappear


    【解决方案1】:

    您可以收听通知并做出适当的回应。尝试使用这些并确定哪些适合您的预期工作流程。

    UIApplicationDidBecomeActiveNotification
    UIApplicationWillEnterForegroundNotification
    

    您可以像这样使用响应通知。

    [[NSNotificationCenter defaultCenter] addObserverForName: UIApplicationDidBecomeActiveNotification object: nil queue: [NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
        // LOAD JSON
    }];
    

    【讨论】:

    • 仅将此代码添加到 .m 文件是行不通的。我应该更改 .h 声明吗? "@interface fergie_timeViewController : UIViewController"
    • 您应该将此代码放入viewDidLoad。您是否在回调块中放置了任何代码?我建议使用NSLog() 进行测试。
    • 不,我没有!我没有意识到我应该把它放在函数中。我按照教程将其添加到 viewWillAppear。现在效果很好,谢谢!
    【解决方案2】:

    我按照本教程进行操作 - http://leejon.es/notifying-a-viewcontroller-with-uiapplicationdidbecomeactivenotification/

    首先,在目标视图控制器的 viewWillAppear 方法中附加通知:

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
    
        [[NSNotificationCenter defaultCenter] addObserver: self
                                                 selector: @selector( appActivated: )
                                                     name: UIApplicationDidBecomeActiveNotification
                                                   object: nil];
    
    }
    
    
    - (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
        [[NSNotificationCenter defaultCenter] removeObserver:self ];
    }
    
    
    - (void)appActivated:(NSNotification *)note
    {
        [self update];
    }
    

    【讨论】:

      【解决方案3】:

      viewDidAppear: 方法采用 bool 参数,无论视图是否显示您缺少的动画。您还必须调用超类的实现:

      - (void)viewDidAppear:(BOOL)animated
      {
         [super viewDidAppear: animated];
         NSLog(@"Called viewDidAppear");
      }
      

      【讨论】:

      • 我进行了编辑,但它仍然只与 viewDidLoad 一起被调用一次。我尝试关闭并重新启动应用程序,我还尝试最小化然后打开应用程序但它没有运行。
      【解决方案4】:

      在您的应用委托实现中,有一个方法称为:

      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
      

      每次启动应用程序时都会调用此方法,因此我认为它符合您的需求。如果您将代码放在这里,它应该可以工作。

      另外,请注意,您不应该在此处执行同步调用,因为您会延迟应用启动。

      编辑: 只有在应用启动时才会调用此方法。您可以将代码放在一个方法中,然后从应用程序 didFinishLaunchingWithOptions 中调用它,然后也可以从该方法中调用它:

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

      该方法会在应用进入前台时调用,但不会在第一次启动后调用,请注意。

      我也认为你应该从苹果开发者页面查看 UIApplicationDelegate 方法:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIApplicationDelegate_Protocol/Reference/Reference.html 此外,检查应用程序状态更改: http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

      【讨论】:

      • 如果我最小化应用然后再次启动它会再次被调用吗?
      • @PriteshDesai 好的,看看我的编辑,我认为 applicationwillenterforeground 可以帮助你。
      • 我只是粘贴了函数,但它没有被调用。我应该对 .h 文件进行任何更改吗?这是一个简单的“@interface fergie_timeViewController : UIViewController”谢谢
      • @PriteshDesai 此方法引用您的 AppDelegate.m 类。它的名称可能不会是 AppDelegate,但它肯定会包含这两个词(即 MyApplicationAppDelegate.m)。看看吧。
      猜你喜欢
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      相关资源
      最近更新 更多