2011-02-08 89 views
0

我有一个UITableView使用自定义单元格,从nibs加载,并连接到控制器(使用initWithNibName:bundle :)。基本上,我注意到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 2011-02-08 22:18:40

+0

嗨viggio24 - 请参阅下面Rob的帖子下的评论。 – smtlaissezfaire 2011-02-09 16:45:28

回答

1

要继续viggio24的界限,我同意我没有看到你正在重新配置单元格的地方。当你出去......你会得到一个已经有“东西”的单元格。这是你的工作,重置所有可见的东西。

您还应仔细阅读Loading Custom Table-View Cells From Nib Files。通常,您使用-loadNibNamed:owner:options:来代替,而不是-initWithNibName:bundle:

相关问题