2012-05-11 251 views
2

我有一個包含多個單元格的表格視圖。當我添加一個新的單元格(使用模態視圖控制器)時,我想向用戶顯示新添加的單元格。要做到這一點,我想滾動表格視圖到新的單元格,選擇它並立即取消選擇它。將表格視圖滾動到單元格,然後刷單元格

現在,我在固定的時間間隔後發送deselectRowAtIndexPath我的表視圖:

- (IBAction)selectRow 
{ 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:7 inSection:0]; 
    [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop]; 
    [self performSelector:@selector(deselectRow:) withObject:indexPath afterDelay:1.0f]; 
} 

- (void)deselectRow:(NSIndexPath *)indexPath 
{ 
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

我不知道是否有這樣做一個更好的方式。它運行良好,但我不喜歡依靠靜態定時器來執行有時會花費不同時間的操作(例如,如果表非常長)。

編輯:請注意,selectRowAtIndexPath:animated:scrollPosition不會導致UITableView委託方法被激發。 tableView:didSelectRowAtIndexPath:scrollViewDidEndDecelerating:都不會被調用。從文檔:

調用此方法不會導致委託接收tableView:willSelectRowAtIndexPath:tableView:didSelectRowAtIndexPath:消息,也不會發送UITableViewSelectionDidChangeNotification通知觀察員。

回答

0

UITableViewDelegateUIScrollViewDelegate的擴展。您可以實施UIScrollViewDelegate方法之一,並使用它來確定何時取消選擇該行。 scrollViewDidEndDecelerating:似乎是一個很好的開始。

另外,我個人發現performSelector...方法由於1個參數限制限制。我更喜歡使用GCD。該代碼是這樣的:

- (IBAction)selectRow 
{ 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:7 inSection:0]; 
    [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop]; 
    //deselect the row after a delay 
    double delayInSeconds = 2.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
}); 

}

+0

感謝GCD的版本。不幸的是,滾動視圖委託不會被通知,因爲滾動不是用戶啓動的。我實現它來檢查,但只有當我手動滾動表時調用它。 –

+0

您可以實現'scrollViewDidScroll:'並檢查'contentOffset.y'來查看單元格是否可見。 –

相關問題