问题在iPhone上重用TableView的单元格

时间:2011-09-10 10:19:41

标签: iphone objective-c uitableview

我在表格视图中有一个单元格列表,其中只有最后一个单元格有一个披露指示符(它触发一个动作)。当我向下滚动单元格列表时,一切正常,但如果我奇怪地向上滚动,则披露指示符也出现在其他单元格中。我无法弄清楚问题在哪里,有什么帮助吗?

谢谢, 丹尼尔

这是使用的代码部分:

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];     
}
cell.textLabel.text = [myArray objectAtIndex:indexPath.row];
if(([myArray count]-1) == indexPath.row) {
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}

3 个答案:

答案 0 :(得分:5)

这不是一个错误:它是一个功能;)因为正在重用这些单元格。

如果您的tableview包含200个单元格,并且您的iphone能够同时显示5个单元格,那么您只有5-6个UITableViewCell个实例。如果你向下滚动一个单元格获取披露按钮,如果你向后滚动单元格正在重复使用,因此披露按钮仍然存在。

解决您的问题:

方法1:不仅在最后一个单元格上设置公开按钮。你也应该在其他单元格中删除/取消它。

方法2:似乎最后一个细胞是语义上的另一种细胞。因此,选择重用标识符,例如:@"MyLastCell表示最后一个单元格,@"MyCell"表示所有其他单元格。因此,您的tableview将只重用相同类型的单元格(在您的情况下:有/没有公开按钮)

编辑1:方法2的一些示例伪代码; 编辑3:方法2的更短解决方案

    static NSString *CellIdentifier = @"Cell";
static NSString *LastCellIdentifier = @"LastCell";

bool isLastRow = (indexPath.row == numRows-1);
NSString *usedCellIdentifier = isLastRow ? LastCellIdentifier : CellIdentifier;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: usedCellIdentifier];

if(!cell)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:usedCellIdentifier] autorelease];
    if(isLastCell)
    {
        //do disclosure-stuff here. Or add a UIButton here
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton
    }   
}

编辑2 :方法1的示例代码

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];     
}

cell.accessoryType = (idexPath.row == numRows-1) ? 
    UITableViewCellAccessoryDetailDisclosureButton 
    : UITableViewCellAccessoryNone ;

答案 1 :(得分:1)

正如托马斯所说,你可以使用他的代码,你可以添加:

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

表示最后一个单元格(在你最后一个单元格出列的地方)和这个:

cell.accessoryType = UITableViewCellAccessoryNone;

用于其他单元格(在您将其他单元格出列的情况下)。

我没有尝试过这段代码,但它应该可以工作......;)

答案 2 :(得分:1)

试试这个

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];     
}
cell.textLabel.text = [myArray objectAtIndex:indexPath.row];
if(([myArray count]-1) == indexPath.row) {
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
else{

    cell.accessoryType = UITableViewCellAccessoryNone;
}