1

在导航控制器中的一个视图中,我有一个方法- (void) loadAlert可以获取网页内容,对其进行解析,并将相关内容放在UITextView. 方法调用位于viewDidAppear:我的视图控制器的部分。当视图首次加载以及导航到视图时完全显示时,它工作正常。

我还希望在应用程序从后台返回时发生此数据加载。正如许多 Stackoverflow 帖子和其他来源所指出的那样,我将方法调用放入applicationDidBecomeActive:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    MainViewController *mainView = [[mainViewController alloc] init];
    [mainView loadAlert];
}

但是,当应用程序从后台返回时,视图中不会发生任何事情。我希望在从 Internet 获取内容时将UITextView其清除,UIActivityIndicatorView然后将新内容加载到UITextView.

我知道正在调用该方法,但视图中没有发生任何事情。我的感觉是调用此方法时视图尚未加载。我可以把我的方法调用放在哪里,以便当应用程序从后台返回时,如果这个特定视图是导航控制器中显示的当前视图,它实际上会刷新 UI?

4

4 回答 4

7

您可以使用UIApplicationWillEnterForegroundNotificationor UIApplicationDidBecomeActiveNotification,在应用程序的任何位置收听这些通知非常有效,您需要将控制器注册到这些通知之一,然后使用您的方法显示您想要的任何内容。

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

-(void) showYouView(){
 // do your stuff
}

笔记

最好的方法是使用 UIApplicationWillEnterForegroundNotification 因为它只会在用户从后台转到前台时运行,另一方面 UIApplicationDidBecomeActiveNotification 会在您的应用程序变为活动状态时运行

于 2013-02-26T22:06:29.863 回答
2

您正在创建一个新实例,mainViewController而不是使用已经存在的同一个实例。每当您执行 amainViewController *mainView = [[mainViewController alloc] init];时,它都是一个新实例。您应该尝试访问视图控制器堆栈中的同一个实例并在其上调用此方法。

我可以把我的方法调用放在哪里,以便当应用程序从后台返回时,如果这个特定视图是导航控制器中显示的当前视图,它实际上会刷新 UI?

假设您已将 UINavigationController 作为属性添加到 appdelegate 中,您可以使用以下代码在applicationWillEnterForegroundtopViewController 上调用 loadAlert。

UIViewController *aViewController = self.navigationController.topViewController;
if ([aViewController isKindOfClass:[mainViewController class]]) {
    [(mainViewController *)aViewController loadAlert];
}

在旁注中,请以大写字母开头类名。例如:- 你应该使用whichMainViewController而不是mainViewController通常代表一个变量名。

更新:

如果您正在使用该UIApplicationWillEnterForegroundNotification方法,则应在notificationMethod方法中添加上述代码以确保mainViewController这是可见的当前视图控制器。否则它可能会表现出一些意想不到的行为。

所以这样的事情应该是好的:

- (void)notificationMethod {

   UIViewController *aViewController = self.navigationController.topViewController;
   if ([aViewController isKindOfClass:[mainViewController class]]) {
      [(mainViewController *)aViewController loadAlert];
   }
}
于 2013-02-26T22:05:56.307 回答
2

处理此问题的正确方法是让您MainViewControllerUIApplicationWillEnterForegroundNotification. 然后当收到通知时,调用该loadAlert方法。

在 MainViewController.m 中:

- (void)enterForeground {
    [self loadAlert];
}

- (void)viewDidLoad {
    [super viewDidLoad];

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

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillEnterForegroundNotification object:nil];
}

您无需为此在应用程序委托中执行任何操作。这样,MainViewController 负责知道应该发生什么以及何时发生。

于 2013-02-26T22:18:09.553 回答
0

我对我的一个项目也有同样的需求,我必须通过notificationCenter系统来处理这件事。

首先,您需要在应用程序进入前台时启动通知:

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"app_entering_foreground" object:self];
}

然后你需要在你需要的地方实际收听这个特定的通知。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateUI) @"app_entering_foreground" object:nil];
于 2013-02-26T22:07:04.013 回答