5

这可能是由于设计不佳造成的,但是当我滚动表格太快,然后滚动回顶部时,放置在最后一个表格单元格中的视图也会放在 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;
}
4

3 回答 3

5

这是我根据 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];
        }
    }
于 2012-11-02T03:12:28.633 回答
2

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

用外行的话来说,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;

}
于 2017-05-25T16:01:18.007 回答
1

它看起来像一个为第 0 行第 0 行布置的单元格正在出列并用于例如第 0 行第 1 行,它不会替换在它保存第 0 行时为其所做的所有设置第 0 行材料。

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

于 2012-11-02T02:02:47.067 回答