2011-06-08 78 views
0

此代码使用UIActivityIndi​​catorView有缺陷吗?看来,我实际上并没有在这里看到指示器/微调器,所以这是因为直到who viewDidLoad完成后才会绘制视图。这是使用UIActivityIndi​​catorView有缺陷的代码吗?

解决此问题的唯一方法是在单独的线程上执行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]; 
} 
+1

您可能想要检查UIActivityIndi​​catorView的大小和来源。 – sosborn 2011-06-08 01:38:28

+0

什么是“将数据加载到tableview”?何时调用stopAnimating? – bshirley 2011-06-08 05:01:58

+0

对不起 - 将更新到正确的代码重试 - 尝试 – Greg 2011-06-08 05:53:08

回答

2

你也应该调用startAnimating。睡觉不是一个好主意。我更倾向于使用performSelector-方法来启动一个不重复的NSTimer。

试试这个:

-(void) doStuff:(id)aSender 
{ 
    [self.waitView stopAnimating]; 
} 
-(void)viewDidLoad 
{ 
    ... 
    [self performSelector:@selector(doStuff:) withObject:self afterDelay:5.0]; 
} 

在addtion:还设置了ActivityIndi​​catorView的帧 - 或越界性质类似的地方sosborn在他的评论中说

+0

我刚刚使用睡眠来模拟一个沉重的表格数据更新代码 - 所以只是为了澄清你是否建议睡眠不是一个很好的选择,通过更新逻辑模拟一旦它到位?那是我热衷于这个线程,以了解什么是可能的“单线程”可以说操作...只是检查你明白这一点? – Greg 2011-06-08 10:27:09

+0

啊,好吧,我只是想你想模拟一个异步任务。然后,睡觉是正确的测试行为。但是如果你的db-stuff需要很长时间,那么你应该外包db-stuff。我假设你的代码将在MainThread中运行。该视图不会更新,如果MainThread正在做一些数据库工作,并且您的活动指标不会显示。 – thomas 2011-06-08 13:10:51

+0

了解它 - 有趣的是,它看起来在viewDidLoad中的所有代码在看到“doStuff”方法开始之前完成(即包括执行选择器行之后的代码)之前 - 我没有假设这是事情的工作方式 – Greg 2011-06-08 23:10:39

1

其实从托马斯的答案应该工作,因为它是,我会补充一点解释,为什么不使用睡眠,因为你已经做了。

iPhone(以及大多数操作系统)上的所有UI处理都只在一个线程中完成 - 主线程 - 执行所谓运行循环的线程。如果您停止该线程,UI将停止,则不会绘制任何内容。

把sleep放到viewDidLoad中,它会在主线程中运行,这样做会停止UI做任何事情。所以,因为在唤醒后你立即调用了[self.waitView stopAnimating],并且活动视图在没有动画的时候应该隐藏起来,你根本看不到它 - 你只是没有给它任何时间显示。

Thomas使用NSTimer在5秒后调用stopAnimating - 现在这让主线程在停止动画和隐藏waitView之前执行代码,并且这将适用于您的测试。

更好的是,您只需让它在没有任何计时器的情况下动画化,并在数据加载完成后使用委托模式通知tableView加载代码,然后停止动画。您不知道数据加载时间会持续多长时间,因此最好等到它完成,而不是在任何特定时间后停止动画。

哦,以及大小和位置是有意义的,但对于测试它并不重要,也不是不看它的原因 - 如果没有指定它将被添加到0,0并且具有默认大小所以你会看到它。

+0

@Thomasz - 谢谢 - 那么只要检查一下(根据我对托马斯的评论)你说的那个“睡眠”函数不会像我的更新逻辑延迟5秒那样效仿? (即运行5秒钟的主动更新逻辑,而不是睡5秒) - 我认为这就是你说的,但只是双重检查 – Greg 2011-06-08 10:29:53

+0

不完全:如果在使用计时器的背景下完成比它可以用来查看UI上会发生什么,它可以模拟数据加载暂停。在现实生活中,您不会那样做,因为数据加载的持续时间未知并使用通知关闭活动视图。所以实际上你也可以使用正确的场景进行测试:在viewDidLoad上启动动画,调用数据加载代码,在那里放置一个定时器5秒,并在定时器触发器上发送通知给你的控制器,以便关闭activityView。这样你的控制器就有适当的逻辑。 – 2011-06-08 13:28:10

+0

而且:不管你如何模仿,你都不应该让主线程进入睡眠状态,因为你在用户界面上看不到任何东西。 – 2011-06-08 13:28:48