2011-06-27 30 views

回答

2

有一個很簡單的解決方法是檢查,如果你是在代表

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

最後一次迭代之後,最終完成的最後一次迭代中添加您的代碼中有

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if([indexPath row] == lastRow){ 
      any code you want 

    } 
} 

謝謝

+0

Thx,它經過小的修改後可以使用。 – Michal

+20

你有沒有考慮過以下? 1)根據'UITableView'的文檔,當'reloadData'被調用時,「table view只顯示那些可見的行。」所以有可能存在'tableView:willDisplayCell:'不會在最後一行被調​​用。 2)即使與這個問題無關,如果表視圖有一個頁腳,它可能會在單元格加載後加載。而且,'reloadData'在加載頁腳後可能會做更多的事情,在這種情況下,當'reloadData'完成時我們不會知道_exactly_。 – Antoni

+0

如何處理底部行因爲它仍然不在屏幕上且沒有頁腳而不可見的情況。我的觀點只有10行,實際上有20(所以10屏幕)。我想滾動到底部。 –

1

讓我們把一個完成塊放進去。誰不愛一個塊?

@interface DUTableView : UITableView 

    - (void) reloadDataWithCompletion:(void (^) (void))completionBlock; 

@end 

和...

#import "DUTableView.h" 

@implementation DUTableView 

- (void) reloadDataWithCompletion:(void (^) (void))completionBlock { 
    [super reloadData]; 
    if(completionBlock) { 
     completionBlock(); 
    } 
} 

@end 

用法:

[self.tableView reloadDataWithCompletion:^{ 
              //do your stuff here 
             }]; 

編輯:

注意,上面是隻有一半的解決方案。在主線程中同步更新段和行的數量以及行高,因此使用上面的代碼,當UI部分完成時,完成將會回調。但是從數據源加載的數據是異步的 - 所以這個答案並不完全是@Michal想要的。

+5

這不就是因爲等待'reloadData'完成而遭受同樣的問題嗎?問題是表的更新是異步發生的,並且會在'[super reloadData]'完成後繼續。 – Rob

+0

是的,你說得對。部分和行的數量以及行高被同步更新,因此部分調用是同步的。但是從數據源加載的數據是異步的。我會更新我的回答,以免誤導別人。 – bandejapaisa

+0

最佳解決方案...感謝好友 – harshitgupta