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”中的错误和冻结
iOS 11 中的 UITableViewRowAction 太宽
UIActionSheet 中的 UIPickerView:UI 冻结