iOS中的UITab冻结

Posted

技术标签:

【中文标题】iOS中的UITab冻结【英文标题】:UITab freeze in iOS 【发布时间】:2012-12-03 13:27:58 【问题描述】:

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

我在 viewDidLoad 中声明了 UIAlertView。 这是一个代码sn-p:

- (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];


点击tab的时候,可以看到Log中显示了第一个NSLog,然后调用了main方法,但是没有显示UIAlertview。

【问题讨论】:

勘误,我使用的是 Xcode 4.5 在自定义实现之前尝试调用superview的viewDidLoad ##解决方案## emrys57的回答解决了问题!答案是将[self callMainMethod]移到viewDidAppear。我还需要在调用函数后放置 [self.tableview reloadData],因为我需要查看 Table 上的数据。 【参考方案1】:

viewDidLoad运行时,可能是关联UIView的frame大小为零。我不知道,但UIAlertView 可能正试图在这个零大小的框架中展示自己。在viewDidAppear 中显示UIAlertView 有意义吗?

如果[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,这通常是足够的。

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

【讨论】:

我尝试在 viewWillAppear 和 viewDidAppear 中添加 UIAlertView,单击选项卡时它仍然“冻结”,然后显示数据和警报。谢谢你的正面回复。我感谢您的帮助。 =) 这是进步,至少。我更新了答案,你可以试试。 就是这样!!非常感谢!将 mainMethod 移动到 ViewDidAppear 确实解决了问题。非常感谢您提供非常详细和解释性的答案。 好样的!很高兴能够提供帮助。非常感谢您的勾选。

以上是关于iOS中的UITab冻结的主要内容,如果未能解决你的问题,请参考以下文章

特征检测期间 iOS Vision API“computeBlinkFunction”中的错误和冻结

java中的声音 - 播放声音时游戏冻结

iOS 11 中的 UITableViewRowAction 太宽

UIActionSheet 中的 UIPickerView:UI 冻结

如何跳转到iOS开发中另一个UITab下的其他UINavigationController?

应用程序因 FMDB 查询更新 ios 而冻结