0

我正在尝试在每个单元格内构建一个带有一些长文本的 UITableView。单元格没有 AccessoryView,除了一个单元格(第 8 个),这是一种打开详细视图的按钮。

考虑这段代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGSize size = [[quotes objectAtIndex:indexPath.row] sizeWithFont:16 constrainedToSize:CGSizeMake(self.view.frame.size.width, CGFLOAT_MAX)];
    return size.height+20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.text = [quotes objectAtIndex:indexPath.row];

    if(indexPath.row==7){
        [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];
    }

    return cell;
}

它可以工作,但问题是当我滚动到表格的底部(第 8 行也是最后一行)然后我回到上面时,另一个 AccessoryView 被添加到一个随机点(或多或少的第 3 行)单元格,但我不知道它是在里面还是随机漂浮)。是否与iOS的单元重用有关?我怎样才能避免它?

提前致谢。

4

3 回答 3

1

该单元正在被重用(如您对 的调用所示-dequeueReusableCellWithIdentifer)。

答案是在出列后将单元格设置为所需else的默认值,或者在语句中添加一个子句if来处理它。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.text = [quotes objectAtIndex:indexPath.row];
    // Set to expected default
    [cell setAccessoryType:UITableViewCellAccessoryNone];

    if(indexPath.row==7){
        [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];
    }

    return cell;
}
于 2012-09-17T00:32:21.170 回答
1

您必须为每个单元格明确设置不公开按钮,但您希望公开的单元格除外。这样,当单元格在其他地方重用时,它的公开指示符就会被删除:

 if(indexPath.row==7){
        [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];
    }else{
        [cell setAccessoryType:UITableViewCellAccessoryNone];
    }
于 2012-09-17T00:32:54.533 回答
1

这是由于您推测的细胞重用。您必须明确设置UITableViewCellAccessoryNone索引路径不是 7 处的单元格。

于 2012-09-17T00:34:34.703 回答