2012-02-23 93 views
0

我在iOS故事板上有一個原型單元格,其中包含UIProgressViewUIProgressView沒有出現在UITableViewCell

定期執行的後臺進程會通知代理它已啓動。此代表應使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

所有背景中的UI操作都應在主線程上執行。 – NeverBe 2012-02-23 17:59:03

+0

感謝所有回覆。它給了我很多東西來看看。然而,一位同事剛剛指出,UITableView之外的另一個UIProgressView(它只是位於視圖的頂部)也正在被後臺進程更新,但是它正在被更新。我會在早上檢查我的代碼。 – 2012-02-23 19:56:20

回答

3

你從tableView的數據源請求一個新的單元格,你得到的單元格不是tableView的一部分。

你想要一個已經在tableview中的單元格,所以要求tableView提供該單元格。

試試這個:

UIProgressView* view = (UIProgressView*) [[[myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]] contentView] viewWithTag:MyProgressViewTag]; 

並確保您從mainThread調用此。您不能從不是主線程的線程處理UI對象。

1

嘗試:

[myTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil]; 

所有UI操作必須在主線程中執行。

希望它有幫助。

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

     } 

好運。

Tim