我在一个包含UIProgressView的iOS情节串连图板上有一个原型单元。
定期执行的后台进程将通知委托它已启动。此委托应使UIProgressView在表单元格上可见,但这并未发生。即使我可以看到委托被调用,它也不会导致UIProgressView出现。
委托方法尝试获取指向UIProgressView的指针,如下所示:
UIProgressView* view = (UIProgressView*) [[[self tableView:myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]] contentView] viewWithTag:MyProgressViewTag];其中,将viewWithTag设置为UIProgressView的标签。
我尝试调用[myTableView reloadData]和[myTableView setNeedsDisplay]来尝试强制重绘单元格,但没有成功。
有什么想法吗?
发布于 2012-02-24 01:59:03
您从tableView的数据源请求一个新的单元格,您得到的单元格不是tableView的一部分。
如果您想要一个已在表视图中的单元格,请询问该单元格的tableview。
试试这个:
UIProgressView* view = (UIProgressView*) [[[myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]] contentView] viewWithTag:MyProgressViewTag];并确保从mainThread调用此函数。不能从不是主线程的线程操作UI对象。
发布于 2012-02-24 02:03:37
尝试:
[myTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil];所有UI操作都必须在主线程上执行。
希望能有所帮助。
发布于 2012-02-24 02:05:14
这只是一种猜测,但如果后台进程运行在主线程以外的其他线程上,则UI将不会更新。所有对UIKit的调用都需要在主线程上进行。您可以做的是使用中央分派(GCD)并将一个块分派到主队列。也就是说,在你需要更新UIProgressView的后台进程中。
dispatch_async(dispatch_get_main_queue(),^{
// your background processes call to the delegate method
});此项目展示了如何使用GCD:https://github.com/toolmanGitHub/BDHoverViewController从后台进程更新UIProgressView
下面是另一个示例:
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];
});
}
}祝好运。
时间
https://stackoverflow.com/questions/9418437
复制相似问题