2013-10-25 6 views
12

すべてのサイズの画像を遅延読み込みするUITableviewがあります。イメージが読み込まれると、特定のセルを更新する必要があるので、reloadRowsAtIndexPathsを使用する必要があるとわかりました。しかし、このメソッドを使用すると、すべての単一セルに対してheightForRowAtIndexPathメソッドが呼び出されます。 reloadRowsAtIndexPathsの目的は、指定した特定の行のheightForRowAtIndexPathだけを呼び出すことだと思いましたか?iOS UITableView reloadRowsAtIndexPaths

理由は何ですか?

[self.messageTableView beginUpdates]; 
[self.messageTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 
[self.messageTableView endUpdates]; 

+0

あなたは試してみましたここでは、このように見えることができるもののための基本的な概要はのみを使用して.. [self.messageTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; –

+0

beginUpdatesとendUpdatesでラップするのではなく、はい、私はそれを試みましたが、それはまだすべての単一のセルの高さをやり直そうとします。この特定のセルだけのためにheightForRowAtIndexPathを呼び出すことを期待しているので、本当に迷惑です。 – Jesse

+0

これは、この1つのセルに対してheightForRowAtIndexPathを呼び出すだけでよいと信じていますか?それとも、テーブル内のすべてのセルに対してこのメ​​ソッドを再度呼び出しますか? – Jesse

答えて

7

endUpdatesheightForRowAtIndexPathを必要とするコンテンツのサイズの再計算をトリガーありがとう。それはちょうどそれが動作する方法です。

問題が発生した場合は、セル設定ロジックをcellForRowAtIndexPathの外に引き出し、reloadRowsAtIndexPathsを経由せずに直接セルを再設定することができます。その後

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellId = ...; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; 
    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId]; 
    } 
    [self tableView:tableView configureCell:cell atIndexPath:indexPath]; 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    //cell configuration logic here 
} 

、現在reloadRowsAtIndexPathsを呼んでいるところはどこでも、あなたの代わりにこれを行うとheightForRowAtIndexPathが呼び出されることはありません:

UITableViewCell *cell = [self.messageTableView cellForRowAtIndexPath:indexPath]; 
[self tableView:self.messageTableView configureCell:cell atIndexPath:indexPath]; 
+1

問題はcellForRowAtIndexPathではありません。どのタイプのリロードを行っても、UITableViewのすべての単一セルに対してheightForRowAtIndexPathが呼び出されるという事実です。私はbeginUpdatesとendUpdatesの使用を中止しましたが、これはまだ発生します – Jesse

+0

@Jesseあなたは私のポイントを見逃しているかもしれません。 'cellForRowAtIndexPath'からあなたのセルの設定ロジックを(' cellForRowAtIndexPath'から呼び出す)スタンドアロンメソッドに移動すると、 'reloadRowsAtIndexPaths'(間接的に' cellForRowAtIndexPath'を呼び出します)の代わりにメソッドを直接呼び出してセルの設定を更新することができます。 )これにより、コンテンツサイズ(間接的に 'heightForRowAtIndexPath'を呼び出します)を再計算するテーブルビューの再読み込み動作をバイパスします。 –

+0

Hey Tim。セルの設定方法を呼びましたが、自動レイアウト制約の競合が発生しました。 300を超えています。それは、セルの高さを更新していないセルを構成しているようです。高さを更新するには、テーブルビューを知らせるためにとにかくですか?手動でconfigure cellを呼び出す前に手動でheightForRowメソッドを呼び出そうとしました。 – Zhang

関連する問題