自定义UITableViewCells在未显示时始终为null

时间:2012-04-18 05:57:51

标签: iphone objective-c ios uitableview

我有UITableView高度为180px,一次只能显示5行,表格视图包含自定义单元格。但是,我有6个单元格,这意味着只有在使用滚动时才会显示第六个单元格,当我尝试循环遍历所有单元格时:

  for (int row = 0; row < [self.autoTableView numberOfRowsInSection:0]; row++)  {

    NSIndexPath* cellPath = [NSIndexPath indexPathForRow:row inSection:0];
    UITableViewCell *cell = [self.autoTableView cellForRowAtIndexPath:cellPath];

    if(!cell)
        NSLog(@"NULL %i", row);

 }

在运行时,如果我没有滚动,我会在控制台窗口中显示NSLog语句,其中显示:NULL 5,当我向下滚动显示最后一个单元格时,我得到一个{ {1}}声明:NSLog,当我向上和向下滚动时,我一直得到这个NULL 0,为什么会发生这种情况,尽管所有单元格都已经创建了?

NSLog代码是:

cellForRowAtIndexPath

然后我在这个自定义单元格内的标签和文本字段上做了各种各样的事情,最后:

static NSString *customCellIdentifier = @"customCell";
EditableTableDataRow *cell = nil;

cell = (EditableTableDataRow *)[tableView dequeueReusableCellWithIdentifier:customCellIdentifier];
if (cell == nil)
{
    cell = [[[EditableTableDataRow alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:customCellIdentifier itemPadding:0 scaleToFill:NO] autorelease];
}

提前非常感谢你。

2 个答案:

答案 0 :(得分:3)

这是默认行为。当未显示单元格时,它们将从内存中释放。 您对它们所做的每一项修改都应该在cellForRowAtIndexPath:方法中完成,即创建它们时。将数据加载到内存中,以便在创建单元格时,它可以快速填满。这就是你顺利滚动的方式。

答案 1 :(得分:0)

要创建的单元格数量取决于视图上显示的单元格数量。在您的情况下,只创建了5个单元格。

cell =(EditableTableDataRow *)[tableView dequeueReusableCellWithIdentifier:customCellIdentifier];

此行将使tableview重用已创建的单元格。因此,当您向下滚动时,您的第一个单元格将消失,这样第一行的创建单元格将用于您的第6行。

希望它有所帮助。