2012-07-26 102 views
2

我有一個UITableView從NSFetchedResultsController接收數據。網絡調用偶爾會更新NSFetchedResultsController的數據。在每次從網絡調用更新數據後,我使用[tableView reloadData]更新UITableView以添加任何新項目。重新加載UITableView數據時無需重定位UITableViewCells

我的UI的一部分還可以使單元格水平重新定位。我希望這些單元格不會在每次刷新表格數據時重新定位,但不幸的是,[tableview reloadData]就是這樣做的。

什麼是在不重新定位行的情況下更新tableview中數據的理想方法?我應該重寫tableview的reloadData方法,並在那裏做一些幻想或者可能覆蓋tableview單元格layoutSubviews方法?

我喜歡這樣的單元位置:

CGRect newFrame = cell.frame; 
newFrame.origin.x = -cell.frame.size.width; 
cell.frame = newFrame; 

後NSFetched結果控制器從網絡呼叫接收更多的數據,它會調用它的委託的方法:

​​

其中要求實現代碼如下:的cellForRowAtIndexPath :和從出站返回的單元格的原點位於(0,0)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"EventCell"; 
    EventCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     [cellNib instantiateWithOwner:self options:nil]; 
     cell = self.customCell; 
    } 

    // Configure the cell... 
    Event *event = [fetchedResultsController objectAtIndexPath:indexPath]; 
    [cell configureCellWithEvent:event]; 

    return cell; 
} 
+0

你能更具體嗎?也許發佈一些關於如何重新定位的代碼,否則很難提出替代方案。 – Dima 2012-07-26 20:10:06

+0

@Dima沒有太多的代碼可以發佈,因爲大部分代碼都發生在蘋果的'[tableView reloadData]'的實現中。我通過修改框架來移動單元格,當我調用'[tableView reloadData]''[tableView dequeueReusableCellWithIdentifier:CellIdentifier]'返回的單元格的原點位於(0,0)時。 – johnnyman727 2012-07-26 20:56:40

+0

可能有更好的方法來做到這一點,但是如何爲單元創建自定義視圖然後讓單元監聽更新並自行更新? – Brian 2012-07-26 21:03:17

回答

0

您可以嘗試UITableViewDelegate方法tableView:willDisplayCell:forRowAtIndexPath:,該方法在將任何單元格添加到表格視圖或滾動到表格的可見區域之前調用。在那裏,您可以根據需要定位單元格,這將在重新加載後生效。

這不是你的問題必不可少的,但我也建議改變單元格的轉換屬性而不是其框架。這樣你就不會意外地將它移動得比你想要的更遠(例如,如果你將它移動兩次)。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    //Determine if the cell should be shifted. 
    if (cellShouldShift) { 
    cell.transform = CGAffineTransformMakeTranslation(0 - cell.bounds.size.width, 0); 
    } else { 
    cell.transform = CGAffineTransformIdentity; 
    } 
} 
+0

此方法在cellForRowAtIndexPath之後調用,此時單元已被設置爲原點。所以如果我知道這個單元格是否曾經被移動過,我可以在那裏完成同樣的事情。困難的部分是確定單元在重新加載之前是否先前移動過。我想我可以在單元格上保留某種標記屬性,但這看起來有點怪異。 – johnnyman727 2012-07-26 22:06:39

+0

在需要時插入行(使用'insertRowsAtIndexPaths:withRowAnimation:')是否可行,而不是重新加載表視圖?如果沒有,你可能不得不採取一些黑客行爲。 – 2012-07-27 00:43:00

+0

我想我不得不求助於黑客,因爲網絡調用也有更新已存在單元的UI的信息。 :( – johnnyman727 2012-07-27 00:46:53