我正在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。
答案 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];
}
如果怀疑是正确的,那么你应该直接UIAlertView
弹出,只是让所有事情都暂时停止,而callMainMethod
执行。
我希望我知道怎么写,“只有在你完成了用这里的所有内容完成更新显示之后才发送这个块”,但我不知道该怎么做。因此,上面的调度调用应该将调用延迟callMainMethod
200ms,这通常很充足。
如果有效,你应该开始另一个问题,比如“我在执行这种方法时如何阻止显示冻结。”