2

NSFetchedResultsController からデータを受け取る UITableView があります。NSFetchedResultsController のデータは、ネットワーク呼び出しによって時々更新されます。ネットワーク呼び出しからデータが更新されるたびに、新しい項目を追加するために [tableView reloadData] で UITableView を更新します。

私の UI の一部では、セルを水平方向に再配置することもできます。テーブルのデータが更新されるたびにこれらのセルが再配置されないようにしたいのですが、残念ながら [tableview reloadData] はそれを行います。

行の位置を変更せずにテーブルビューのデータを更新する理想的な方法は何ですか? テーブルビューの reloadData メソッドをオーバーライドして、そこで何か凝ったことをするか、テーブルビュー セルの layoutSubviews メソッドをオーバーライドする必要がありますか?

セルを次のように配置します。

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

NSFetched Results Controller がネットワーク呼び出しからさらにデータを受け取った後、デリゲートのメソッドを呼び出します。

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.eventTableView reloadData];
}

tableview: 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;
}
4

1 に答える 1

0

UITableViewDelegate メソッドtableView:willDisplayCell:forRowAtIndexPath:を試すことができます。このメソッドは、セルがテーブル ビューに追加されるか、テーブルの表示領域にスクロールされる直前に呼び出されます。そこに、必要に応じてセルを配置できます。これは、リロード後に機能します。

これはあなたの質問には必須ではありませんが、フレームの代わりにセルの変換プロパティを変更することもお勧めします。そうすれば、誤って必要以上に移動することはありません (たとえば、2 回シフトした場合など)。

- (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;
  }
}
于 2012-07-26T21:24:39.183 に答える