カスタムセルを使用し、ペン先からロードされ、(initWithNibName:bundle :)を使用してコントローラに接続されたUITableViewがあります。基本的には、dequeueReusableCellWithIdentifierは既にロードされたセルを返しますが、そうでなければならないことに気付きました。ここでdequeueReusableCellWithIdentifierが間違ったセルを返します
は私のデリゲートメソッドです:
- (UITableViewCell *) tableView: (UITableView *) tv cellForRowAtIndexPath: (NSIndexPath *) indexPath {
return [[self controllerForTableView: tv cellForRowAtIndexPath: indexPath] cell];
}
- (TableViewCellBaseController *) controllerForTableView: (UITableView *) tv cellForRowAtIndexPath: (NSIndexPath *) indexPath {
[self checkValidTableView: tv];
UIViewController *controller;
Class class;
Event *event;
int row = [indexPath row];
DLOG(@"at index path row: %i", row);
if (row == [currentEvents count]) {
controller = [self tableCellContainerFromNibName: nibName
tableView: tv
atIndex: row
withClass: class];
} else {
class = [EventFeaturedTableViewCell class]; // TODO: OR class = [EventNonFeaturedTableViewCell class];
event = [self findEventFromIndex: row];
lastSelectedEvent = event;
DLOG(@"event: %@", event);
controller = [self tableCellContainerFromNibName: NSStringFromClass(class)
tableView: tv
atIndex: row
withClass: class
perform: @selector(initTableCellWithController:)
on: self];
}
return controller;
}
- (TableViewCellBaseController *) tableCellContainerFromNibName: (NSString *) nibName
tableView: (UITableView *) tableView
atIndex: (int) index
withClass: (Class) class
perform: (SEL) selector
on: obj {
CustomTableViewCell *cell = (CustomTableViewCell *) [tableView dequeueReusableCellWithIdentifier: nibName];
TableViewCellBaseController *controller;
DLOG(@"Cell: %@", cell);
DLOG(@"Cell Identifier: %@", nibName);
if (cell == nil) {
controller = [[class alloc] initWithNibName: nibName bundle: nil];
if (obj) {
[obj performSelector: selector withObject: controller];
}
// run this after setting data as controller.view eager loads the view
cell = controller.cell = controller.view;
cell.controller = controller;
} else {
controller = cell.controller;
if (obj) {
[obj performSelector: selector withObject: controller];
}
}
return controller;
}
- (void) initTableCellWithController: (EventsIndexTableViewCell *) controller {
controller.event = lastSelectedEvent;
}
カスタム細胞は、コントローラのビュープロパティを使用して、コントローラだけでなく、「セル」プロパティにIBにフックアップされています。カスタムセルには、ペン先に直接設定された固有の識別子があります。
私は既にコントローラのデータが正しいことを確認しました。イベント「アトランティック・ベイは、」テーブルの後半で、その後、テーブルに最初に表示されることを
http://screencast.com/t/NI2Tpc7GKEi
お知らせ:
は、ここで私はシミュレータで見ている効果です。バックアップをスクロールすると、テーブルの最初のエントリとして表示されなくなります。
しかし、コントローラのsetEvent:メソッドは、セルの内容を変更するためにオーバーライドされていますか?答えがない場合は、デキューされたセルの構造(cell.controller)は変更されますが、コンテンツは変更されないためです。コントローラNibがロードされ、そのビューが作成されたときに、コントローラのsetEventを使用して明示的に更新しないと、セル構造が一度作成されることを考慮してください。 Nibsが毎回呼び出されるため、テーブルの最初のセルは正常です。これは、システムがキューに入れられたセルを再利用するまで発生します。 – viggio24
ちょっとviggio24 - 下のロブの記事の下のコメントを参照してください。 – smtlaissezfaire