2011-02-08 8 views
0

カスタムセルを使用し、ペン先からロードされ、(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

お知らせ:

は、ここで私はシミュレータで見ている効果です。バックアップをスクロールすると、テーブルの最初のエントリとして表示されなくなります。

+1

しかし、コントローラのsetEvent:メソッドは、セルの内容を変更するためにオーバーライドされていますか?答えがない場合は、デキューされたセルの構造(cell.controller)は変更されますが、コンテンツは変更されないためです。コントローラNibがロードされ、そのビューが作成されたときに、コントローラのsetEventを使用して明示的に更新しないと、セル構造が一度作成されることを考慮してください。 Nibsが毎回呼び出されるため、テーブルの最初のセルは正常です。これは、システムがキューに入れられたセルを再利用するまで発生します。 – viggio24

+0

ちょっとviggio24 - 下のロブの記事の下のコメントを参照してください。 – smtlaissezfaire

答えて

1

viggio24の行を続行するには、セルを正しく再設定している場所が表示されないことに同意します。あなたがデキューすれば、すでに「もの」を持っているセルを手に入れることになります。見えるものをすべてリセットするのはあなたの仕事です。

また、慎重にLoading Custom Table-View Cells From Nib Filesも読んでください。通常は-initWithNibName:bundle:ではなく-loadNibNamed:owner:options:を使用します。

+0

セルをどのように再構成しますか?最初のロード時には、セルは包含コントローラーのviewDidAppearのコンテンツと共にロードされます。 ViewWillAppearに類似したものがありますか? viewWillAppear:コントローラで動作していないようです。 – smtlaissezfaire

+1

セルの-viewWillAppearに相当するのは '-tableView:willDisplayCell:forRowAtIndexPath:'です。 –

+0

だから、私は[cell setNeedsDisplay]を-tableView:willDisplayCell:forRowAtIndexPath:と呼んでいます。 – smtlaissezfaire

関連する問題