单个UITableViewCell与AccessoryView

时间:2012-09-17 00:15:15

标签: ios uitableview

我正在尝试使用每个单元格内的一些长文本构建一个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被添加到一个随机点(更多或少了第三个细胞,但我不知道它是在里面还是随机漂浮着)。 它是否与iOS重复使用的细胞有关?我怎么能避免它?

提前致谢。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

您必须明确地为每个单元格设置不公开按钮,但是您希望披露的单元格。这样,当细胞在其他地方重复使用时,其披露指标就会被删除:

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

答案 2 :(得分:1)

这是由于您猜测的细胞重用。您必须为索引路径不是7的单元格显式设置UITableViewCellAccessoryNone