此代码使用UIActivityIndicatorView是否有缺陷?看来我实际上根本没有看到指标/微调器,所以这是因为在viewDidLoad完成之前不会绘制视图吗?
是否可以在单独的线程上执行viewDidLoad自定义工作(例如数据更新)? (我希望在这种情况下更简单的单线程操作)。有没有办法在数据加载评估之前强制视图在“startAnimating”行之后刷新?
来自UITableViewController实现的代码:
- (void)viewDidLoad {
// Wait indicator - Start
self.waitView = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge] autorelease];
self.waitView.hidesWhenStopped = true;
[self.view addSubview: self.waitView];
// Load data into tableview
[NSThread sleepForTimeInterval: 5.0]; // Test code to simulate
[self.waitView stopAnimating];
}
答案 0 :(得分:2)
您还应该调用startAnimating。睡觉不是个好主意。我更喜欢performSelector
- 方法,这些方法会引发一个不重复的NSTimer。
试试这个:
-(void) doStuff:(id)aSender
{
[self.waitView stopAnimating];
}
-(void)viewDidLoad
{
...
[self performSelector:@selector(doStuff:) withObject:self afterDelay:5.0];
}
另外:还设置了ActivityIndicatorView的frame-或bounds-property,就像索斯伯恩在评论中所说的那样
答案 1 :(得分:1)
实际上托马斯的回答应该是这样的,我会添加一些解释,说明为什么不像你一样使用睡眠。
iPhone上的所有UI处理(以及大多数操作系统)都只在一个线程中完成 - 主线程,即执行所谓的运行循环的线程。如果您停止该线程,UI将停止,则不会绘制任何内容。
将sleep放入在主线程中运行的viewDidLoad就可以做到这一点 - 阻止UI做任何事情。所以,因为在唤醒后你立即调用[self.waitView stopAnimating]
并且活动视图应该在没有动画时隐藏,你根本看不到它 - 你只是没有给它任何时间来展示。
Thomas使用NSTimer在5秒后调用stopAnimating - 现在这让主线程在停止动画和隐藏waitView之前执行代码,这将适用于您的测试。
更好的是,你只需让它没有任何计时器动画,并在加载数据后使用tableView加载代码通知委托模式,然后停止动画。你不知道数据的加载时间会持续多长时间,所以最好等到它完成后再停止在任何特定时间后制作动画。
哦,好的,大小和位置是有道理的,但是对于测试它并不重要,并且不是没有看到它的原因 - 如果没有指定它将被添加到0,0并具有默认大小所以无论如何你会看到它。