2017-01-24 3 views
0

XCodeウィザードで作成されたマスター/ディテールプロジェクトには、dequeueReusableCellWithIdentifier:forIndexPath:を呼び出したtableView:cellForRowAtIndexPath:の実装が含まれています。次に、独自のカスタムメソッドconfigureCellを呼び出して、有効なデータでセルコントロールを埋め込み、呼び出し元にセルを返します。私が理解しているように、これはどのようにテーブルがその細胞の内容を描くかを知っている方法です。tableView:cellForRowAtIndexPath:はどのように使われますか?

私が理解できないことは、自分のコードからセルを取得するときにどのように使用するかです。そして、それは私のコードによって呼び出されることになっているのでしょうか?それとも、それはテーブルフレームワーク自体によって使用されるコールバックですか?

たとえば、セル内の1つのラベルのテキストを変更する場合は、tableView:cellForRowAtIndexPath:を呼び出して、結果のセルオブジェクトコントロールで必要なものを変更することができます。しかし、tableView:cellForRowAtIndexPath:を呼び出すと、実際には新しいセルオブジェクトが作成され(おそらく未使用のセルオブジェクトのプールから再利用されます)、イメージビューやラベルのようなすべてのコントロールをデータで埋めます。これはパフォーマンスに関して、私が1つのラベルだけを変更したいときには、私には良く見えません。

のうちconfigureCellを削除できますか?しかし、[table reloadData]が呼び出されたときに、どのようにすべてのセルの内容がシステムによって再描画されるかを確認する方法はありますか?

P.S.この種のコード作成 XCodeの7ウィザード:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
    NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 
    [self configureCell:cell withObject:object]; 
    return cell; 
} 

// Then later in controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: 

    case NSFetchedResultsChangeUpdate: 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] withObject:anObject]; 
     break; 

configureCellは二度ここに呼ばれています。私には意味がないようです。私は、少なくともウィザードのコードを書いている人が、これがどのように動作するはずかを理解することを望んでいました。

+0

この呼び出しは、テーブルフレームワークでのみ使用されます。 reloadRowsAtIndexPathsを呼び出して、特定の行を更新するために1行だけを送信することができます。 –

答えて

1

ここでは、類似の名前を持つ2つの異なる方法があります。

は、テーブルに表示するセルを作成するために実装するUITableViewDataSourceメソッドです。新しいセルが画面に表示されるときに、このメソッドが呼び出されます。

controller:didChange:...cellForRowAtIndexPath:という別のメソッドを呼び出しています。このメソッドはUITableViewメソッドです。このメソッドは、tableView:cellForRowAtIndexPath:データソースメソッドを使用して以前に作成された後に既に表示されているセルをテーブルに照会し、再度呼び出されることはありません。このメソッドは、既に表示されているセルにアクセスし、オブジェクトが変更されたときに新しい情報で更新します。

configureCellの両方の呼び出しが必要です。

+0

私の悪い、メソッド名はあまりにも似ている、私は彼らが実際に異なって見ていない。今それは理にかなっています。ありがとう。 – jesse

+0

しかし、なぜ両方のconfigureCellの呼び出しがここで必要ですか? 2番目のものは、最初のものによって行われたすべてのものを上書きしませんか? – jesse

+0

2番目のオブジェクトは、オブジェクトが変更されたときにのみ呼び出され、現在セルにあるデータを更新されたオブジェクトのデータで上書きします。 – dan

関連する問題