UITab在iOS中冻结

时间:2012-12-03 13:27:59

标签: objective-c ios uialertview freeze uitabcontroller

我正在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显示在日志中,然后调用main方法,但不显示UIAlertview。

1 个答案:

答案 0 :(得分:1)

viewDidLoad正在运行时,可能是关联的UIView的frame大小为零。我不知道,但UIAlertView可能试图在这个零大小的框架中呈现自己。如果您在UIAlertView中展示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执行。

我希望我知道怎么写,“只有在你完成了用这里的所有内容完成更新显示之后才发送这个块”,但我不知道该怎么做。因此,上面的调度调用应该将调用延迟callMainMethod 200ms,这通常很充足。

如果有效,你应该开始另一个问题,比如“我在执行这种方法时如何阻止显示冻结。”