我在iOS故事板上有一个包含UIProgressView
的原型单元格。
定期执行的后台进程通知委托它已启动。该委托应该使UIProgressView
在表格单元格中可见,但这不会发生。即使我可以看到被调用的委托,也不会导致UIProgressView
出现。
委托方法尝试获取指向UIProgressView
的指针,如下所示:
UIProgressView* view = (UIProgressView*) [[[self tableView:myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]] contentView] viewWithTag:MyProgressViewTag];
将viewWithTag
设置为UIProgressView
的标记。
我试过调用[myTableView reloadData]
和[myTableView setNeedsDisplay]
来尝试强制重绘单元格,但它没有用。
有什么想法吗?
答案 0 :(得分:3)
您从tableView的数据源请求一个新单元格,您获得的单元格不是tableView的一部分。
您想要一个已经在tableview中的单元格,因此请向tableView查询该单元格。
试试这个:
UIProgressView* view = (UIProgressView*) [[[myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]] contentView] viewWithTag:MyProgressViewTag];
并确保从mainThread中调用此方法。您无法从不是主线程的线程中操纵UI对象。
答案 1 :(得分:1)
尝试:
[myTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil];
必须在主线程上执行所有UI操作。
希望它有所帮助。
答案 2 :(得分:1)
只是猜测,但如果您的后台进程在主线程以外的其他位置运行,则UI将不会更新。所有对UIKit的调用都需要在主线程上进行。你可以做的是使用Grand Central Dispatch(GCD)并将一个块发送到主队列。即在你需要更新UIProgressView的后台进程中。
dispatch_async(dispatch_get_main_queue(),^{
// your background processes call to the delegate method
});
这个项目展示了如何使用GCD从后台进程更新UIProgressView:https://github.com/toolmanGitHub/BDHoverViewController
这是另一个例子:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0),^{
NSInteger iCntr=0;
for (iCntr=0; iCntr<1000000000; iCntr++) {
if ((iCntr % 1000)==0) {
dispatch_async(dispatch_get_main_queue(), ^{
[blockSelf.hoverViewController updateHoverViewStatus:[NSString stringWithFormat:@"Value: %f",iCntr/1000000000.0]
progressValue:(float)iCntr/1000000000.0];
});
}
}
祝你好运。
添