UIProgressView没有出现在UITableViewCell上

时间:2012-02-23 17:52:55

标签: objective-c ios uitableview uiprogressview

我在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]来尝试强制重绘单元格,但它没有用。

有什么想法吗?

3 个答案:

答案 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];
                });
            }

        }
祝你好运。