UITableView - 当滚动太快时,最后一个单元格的内容替换第一个单元格

时间:2012-11-02 01:53:32

标签: objective-c ios uitableview

这可能是由于设计不佳造成的,但是当我滚动表太快,然后滚动回到顶部时,放在最后一个表格单元格中的视图也会放在tableView中的第一个表格单元格上。

我认为这可能是由于我使用if语句在第一部分中放置了一些静态内容而在第二部分中放置了动态内容。

感谢任何帮助。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...

    if (indexPath.section == 0) {

        if (indexPath.row == 0) {

            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(10, 13, 282, 20)];
            textField.clearsOnBeginEditing = NO;
            textField.placeholder = @"enter template name";
            textField.font = [UIFont systemFontOfSize:15.0];
            textField.clearButtonMode = UITextFieldViewModeWhileEditing;
            textField.delegate = self;
            textField.text = [selectedTemplate name];
            [textField addTarget:self action:@selector(nameDidChange:) forControlEvents:UIControlEventEditingChanged];
            [cell.contentView addSubview:textField];

        } else {

            cell.textLabel.text =  @"Add a new question";
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

        }

    } else {

        NSString *label = [[sortedQuestions valueForKey:@"questionText"] objectAtIndex:indexPath.row];
        CGSize stringSize = [label sizeWithFont:[UIFont boldSystemFontOfSize:15] constrainedToSize:CGSizeMake(230, 9999) lineBreakMode:NSLineBreakByWordWrapping];

        UITextView *textV=[[UITextView alloc] initWithFrame:CGRectMake(5, 5, 230, stringSize.height+10)];
        textV.font = [UIFont systemFontOfSize:15.0];
        textV.text=label;
        textV.textColor=[UIColor blackColor];
        textV.editable = NO;
        textV.userInteractionEnabled = NO;
        textV.backgroundColor = [UIColor colorWithRed:0.97f green:0.97f blue:0.97f alpha:1.00f];
        [cell.contentView addSubview:textV];

        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    }

    return cell;
}

3 个答案:

答案 0 :(得分:4)

根据Wienke的建议,这是我最终做的事情。我在我的故事板中添加了3个原型单元,名为Cell,Cell2,Cell3。

相关代码:

static NSString *CellIdentifier = @"Cell";
static NSString *CellIdentifier2 = @"Cell2";
static NSString *CellIdentifier3 = @"Cell3";

UITableViewCell *cell;

if (indexPath.section == 0 && indexPath.row == 0) {

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

} else if (indexPath.section == 0 && indexPath.row == 1) {

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2 forIndexPath:indexPath];

} else if (indexPath.section == 1) {

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier3 forIndexPath:indexPath];

}

我还添加了这个以检查我的动态单元格,并删除任何可能在添加新子视图之前可能闲置的延迟子视图。

    if ([cell.contentView subviews]){
        for (UIView *subview in [cell.contentView subviews]) {
            [subview removeFromSuperview];
        }
    }

答案 1 :(得分:1)

看起来像第0行第0行所列出的单元格正在出列并用于第0行第1行,它不会替换为它所做的所有设置。持有第0行0材料。

您可能需要考虑使用3个单独的单元格标识符,一个用于第0行第0行,一个用于第0行第1行,另一个用于所有其余标识符。您需要一组初步的if语句(或switch-case语句),以便在调用dequeueReusableCellWithIdentifier:时使用正确的标识符。

答案 2 :(得分:1)

我知道这已经有了一个可以接受的答案,但我想我会更深入地探讨这种情况发生的“原因”和解决方案。

用外行人的话说,UITableView令人耳目一新的提示与提出的呈现速度有关。换句话说,由于快速滚动,表格视图预计会更快地重新填充内容,而不是对预期单元格进行排序,以便重复使用它的相应索引(行)。

Wienke所涉及的最简单的解决方案是为第一个(即三个(3))单元格创建不同的单元格标识符。这将允许表格视图能够清楚地区分3个单元格,防止任何单元格错位。

这里最好的方法可能是为每个单元分配相关的单元标识符(取决于上下文和单元数)。通过这种方式,表视图可以准确地知道哪个单元格(以及它的相应ID)在哪里。简单如下:

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

    NSString *cellID = [NSString stringWithFormat:@"cell%lu", indexPath.row];
    __kindof UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

    if (!cell) {

        // Create your cell here.
        cell = [...allocate a new cell...] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];

    }

    return cell;

}