UITableView与滚动时混合内容的自定义UITableViewCells

时间:2010-08-19 16:36:17

标签: objective-c iphone uitableview

我有一个异构的tableView,整个部分由UITableViewCells组成,每个人的contetView都有一个UITextField控件。问题是我在滚动时看到文本字段中写入的文本混合在一起。

我在这个问题之前已经多次看过了,尽管它被弃用了,但我通过为每种类型的单元格分配不同的cellIdentifier来解决这个问题。

现在有什么不同,我正在动态创建单元格,并且根据服务器的答案,表格的部分可能有零个或多个自定义单元格(具有textField的单元格)。

现在,有趣的是看到textfiled的属性(如占位符)在整个滚动条中都是持久的,但我写的文本根本不是持久的,文本改变了它的位置......

我有一段视频here,所以你可以看到我的意思。

我使用的代码如下:

    // Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";
    NSString *varCellID = [NSString stringWithFormat:@"%i_VarCellID", (indexPath.row + 7891)];

    if (indexPath.section == 0) {
           UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            [self configureCellViews:cell indexPath:indexPath];
        }
        [self configureCellContent:cell indexPath:indexPath];
        return cell;
    }
    else if (indexPath.section == 1) {
              UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            [self configureCellViews:cell indexPath:indexPath];
        }
        [self configureCellContent:cell indexPath:indexPath];
        return cell;
    }
    else {
            UITableViewCell *varCell = [tableView dequeueReusableCellWithIdentifier:varCellID];

        if (varCell == nil) {
            varCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:varCellID] autorelease];
            varCell.selectionStyle = UITableViewCellSelectionStyleNone;
            [self configureCellViews:varCell indexPath:indexPath];
        }
        [self configureCellContent:varCell indexPath:indexPath];
        return varCell;
    }
}

我知道它不优雅,但之前已经开过话了。除了dinamically创建的单元格标识符,这是我(绝望)尝试在每个textField上保留单个内容之一。

以下是我创建单元格视图和内容的方法:

#pragma mark -
#pragma mark  ConfigureCellcontent

- (void)configureCellViews:(UITableViewCell *)cell indexPath:(NSIndexPath *)indexPath {

    NSArray *aSection = [sections objectAtIndex:indexPath.section];
    NSDictionary *aField;
    int varformatid;

    if (indexPath.section == 0) {

        cell.detailTextLabel.textAlignment = UITextAlignmentLeft;
    }
    else if (indexPath.section == 1) {

        cell.detailTextLabel.textAlignment = UITextAlignmentLeft;
    }
    else {

        aField = [aSection objectAtIndex:indexPath.row];
        varformatid = [[aField valueForKey:@"varformatid"] intValue];
        NSArray *aSection = [sections objectAtIndex:indexPath.section];
        NSLog(@"format id %@", [[aSection objectAtIndex:0] valueForKey:@"varname"]);

        fieldLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 7, 100, 30)];
        fieldLabel.tag = 1234;
        fieldLabel.textAlignment = UITextAlignmentLeft;
        fieldLabel.font = [UIFont boldSystemFontOfSize:14];
        fieldLabel.adjustsFontSizeToFitWidth = YES;
        [cell.contentView addSubview:fieldLabel];

        theTextField = [[UITextField alloc] initWithFrame:CGRectMake(130, 12, 170, 30)];
        theTextField.textColor = kAnswersTextColor;
        theTextField.returnKeyType = UIReturnKeyDone;
        theTextField.tag = indexPath.row + 101;
        theTextField.adjustsFontSizeToFitWidth = YES;
        theTextField.delegate = self;


        if(varformatid == 6 || varformatid == 7 || varformatid == 8) {
            // use number pad input
            theTextField.keyboardType = UIKeyboardTypeNumberPad;
            [cell addSubview: theTextField];
            [theTextField release];
        }
        else if(varformatid == 4) {
            // use date
        }
        else if(varformatid == 17 || varformatid == 18) {
            // use pull down, elements of pull down are in XML
        }
        else if(varformatid == 20) {
            theSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(120, 8, 100, 30)];
            theSwitch.selected = YES;
            [cell.contentView addSubview:theSwitch];
        }
        else {
            // use input string
            [cell addSubview: theTextField];
            [theTextField release];
        }       
    }

}

- (void)configureCellContent:(UITableViewCell *)cell indexPath:(NSIndexPath *)indexPath {

    NSArray *aSection = [sections objectAtIndex:indexPath.section];
    NSString *aField;


    if (indexPath.section == 0) {
        aField = [[aSection objectAtIndex:0] valueForKey:@"SetDate"];
        cell.textLabel.text = @"Set Date";
        cell.detailTextLabel.text = aField;
    }
    else if (indexPath.section == 1) {
        aField = [[aSection objectAtIndex:0] valueForKey:@"SetType"];
        cell.textLabel.text = @"Set Type";
        cell.detailTextLabel.text = aField;
    }

    else {

        aField = [[aSection objectAtIndex:indexPath.row] valueForKey:@"varname"];
        if ([[[aSection objectAtIndex:indexPath.row] valueForKey:@"varrequired"] isEqualToString:@"yes"]) {
            [(UITextField *)[cell viewWithTag:indexPath.row + 101] setPlaceholder: @"Required"];
        }
        else [(UITextField *)[cell viewWithTag:indexPath.row + 101] setPlaceholder: @"Optional"];
        [(UILabel *)[cell.contentView viewWithTag:1234] setText: aField];

    }
}

最后,我请求你的帮助,找到至少一种更好的方法。提前谢谢。

4 个答案:

答案 0 :(得分:2)

您的configureCellContent似乎已损坏。因此,您要么没有使用键入的文本更新内部数据结构(您可能希望在每次文本更改时都这样做),或者您错过了在configureCellViews中填写正确的值。

旁注:你不应该在顶部出两个单元格。只是出列一个正确的!即将其放入 if 部分。

答案 1 :(得分:2)

我之前遇到过这个。我相信这是因为UITableViewCells在不可见时被释放以减少内存消耗。当您向上滚动时,您将获得该单元格的新出列实例。

您需要将某个单元格的状态保存到某个位置,以便在它返回视图时重新初始化它。保存完全取决于您 - 当您的UITextField失去焦点,或者以任何方式更改字段时。

答案 2 :(得分:1)

我不知道这是否是您参加的解决方案,但您可以修改CellIdentifier并使其独一无二。

NSString *CellIdentifier = [NSString stringWithFormat:@"Cell %d",indexPath.row];

答案 3 :(得分:0)

NSString * CellIdentifier = [NSString stringWithFormat:@“Cell%d”,indexPath.row]; 代替静态NSString * CellIdentifier = @“Cell”;

是在快速滚动的情况下混合行的解决方案。