2

我正在 Xcode 4.2 上开发 iOS 5.1 应用程序。我有一个带有不同选项卡的 uitablcontroller。我的问题是,当单击一个选项卡时,应用程序“冻结”几秒钟并执行它应该执行的所有代码,但它没有按应有的方式首先加载 UIAlertView。

我在 viewDidLoad 中声明了 UIAlertView。这是一个代码片段:

- (void)viewDidLoad
{



NSLog(@"##### VIEW DID LOAD 1 #####");


// Display Alert: Loading

alertView = [[UIAlertView alloc] initWithTitle:@"Loading"
                                       message:@"\n"
                                      delegate:self
                             cancelButtonTitle:nil
                             otherButtonTitles:nil];

UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
spinner.center = CGPointMake(139.5, 75.5); // .5 so it doesn't blur
[alertView addSubview:spinner];
[spinner startAnimating];
[alertView show];

[super viewDidLoad];


NSLog(@"##### VIEW DID LOAD 2 #####");


self.tableView.dataSource = self;
self.tableView.delegate = self;

[self callMainMethod];

}

当点击选项卡时,我可以看到第一个 NSLog 显示在 Log 中,然后调用 main 方法,但没有显示 UIAlertview。

4

1 回答 1

1

viewDidLoad运行时,可能是frame关联的 UIView 的大小为零。我不知道,但它UIAlertView可能正试图在这个零尺寸的框架中展示自己。UIAlertView如果您提出in是否有意义viewDidAppear

如果[self callMainMethod]需要大量计算能力,则显示可能在完成之前不会更新。您可以尝试将其移至viewDidAppear. 您也可以尝试延迟它,以便 UI 线程的主运行循环、显示更新的线程和执行的线程viewDidLoad以及所有其他view...方法,有时间完成所有事情并在开始繁重之前变得空闲加工。只有当运行循环完成了它所能做的所有处理时,它才真正开始更新显示。像这样:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 200000000), dispatch_get_main_queue(), ^{
   [self callMainMethod];
}

相关文档位于http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

如果这种怀疑是正确的,那么您应该UIAlertView直接弹出,只是让一切都死了一段时间,而callMainMethod执行。

我希望我知道怎么写,“只有在你设法完成更新显示到这里的所有内容之后才发送这个块”,但我不知道该怎么做。所以上面的调度调用应该将调用延迟callMainMethod200 毫秒,这通常是足够的。

如果可行,您可能应该开始另一个问题,例如“如何在执行此方法时停止显示冻结”。

于 2012-12-03T13:34:28.180 回答