从AppDelegate向活动viewController添加子视图

时间:2012-12-14 08:52:28

标签: objective-c ios

我正在使用sqlite数据库创建一个应用程序。我使用从Web服务检索的信息更新数据库。我从AppDelegate调用Web服务,如下所示:

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

    // get new information from web service
    // update sqlite database

}

网络服务可能需要很长时间,因此我想将UIActivityIndicatorView添加到任何有效的viewController。当然,在更新完成后删除它。 想法?

3 个答案:

答案 0 :(得分:0)

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 420, 480)];
    testView.backgroundColor = [UIColor redColor];
    [self.window.rootViewController.view addSubview:testView];
}

然后,无论何时完成,请执行:

[testView removeFromSuperview];

答案 1 :(得分:0)

在每个视图控制器(或公共超类视图控制器)中,监听应用程序激活时发送的UIApplicationDidBecomeActiveNotification通知。

通过这种方式,您可以为每个视图控制器提供自定义逻辑,而无需通过使用大量ifs将应用委托委托给代码的其他部分(如果您需要区分哪个视图控制器是活动的)。

答案 2 :(得分:-1)

因为您的视图层次结构可以采用任何形式,所以您必须自己跟踪当前可见的视图控制器。例外:如果您的应用程序中的所有内容都发生在UINavigationController中,您始终可以使用此方法获取当前视图控制器。

[navigationController topViewController];

但是,如果只需要显示叠加层,则可以将该视图添加到根视图控制器的视图中;无论如何,所有子视图控制器都只是作为子视图显示。

UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[self.window.rootViewController.view addSubview:activityIndicator];
[activityIndicator startAnimating];

尽管如此,手动将视图投入到这样的混合中并不是很优雅。我会考虑在发生各种网络事件时发布通知,并让每个视图控制器自行更新。