单元格在表格视图中重叠

时间:2013-09-01 11:00:38

标签: ios uitableview

我正在尝试使用单元格和文本字段实现UITableView,但单元格保持重叠,文本字段从一个部分跳到另一个部分。

有人可以检查我的代码是否有任何错误吗?

listForItemsinfo =[[NSArray alloc]initWithObjects:@"Name",@"Price", nil];
listForBrandYear  =[[NSArray alloc] initWithObjects:@"Year",@"Alfa",@"aston",@"audi",@"bentley",@"BMW",@"Cadillac",@"Chevrolet",@"Ferrari",@"Ford",@"Jaguar",@"Jeep",@"Kia",@"Landrover",@"Mazda",@"Mercedes",@"Mitsubishi",@"Nissan",@"Porshe",@"Subaru", nil];



listForkeywords  =[[NSArray alloc] initWithObjects:@"KeyWord1",@"Keyword2", nil];
listForcarType  =[[NSArray alloc] initWithObjects:@"Sedan",@"Convertible",@"Coupe",@"Heatchback", nil];
listForItemsCategory =[[NSArray alloc] initWithObjects:@"cat1",@"cat2",@"cat3",@"cat4",@"cat5",@"cat6", nil];

sections = [[NSArray alloc]initWithObjects:@"Item's info",@"Brand, Year",@"Keywords",@"Car Type",@"Category", nil];
listOfsections =[[NSArray alloc]initWithObjects:listForItemsinfo,listForBrandYear,listForkeywords,listForcarType,listForItemsCategory, nil];



- (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];


    if (indexPath.section == 0) {

            // Add a UITextField
        UITextField *textField = [[UITextField alloc] init];
        // Set a unique tag on each text field
        textField.tag = 1+ indexPath.row;
        // Add general UITextAttributes if necessary
        textField.enablesReturnKeyAutomatically = YES;
        textField.autocorrectionType = UITextAutocorrectionTypeNo;
        textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
        [cell.contentView addSubview:textField];


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

        UITextField *textField = [[UITextField alloc] init];
        // Set a unique tag on each text field
        textField.tag = 2+ indexPath.row;
        // Add general UITextAttributes if necessary
        textField.enablesReturnKeyAutomatically = YES;
        textField.autocorrectionType = UITextAutocorrectionTypeNo;
        textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
        [cell.contentView addSubview:textField];
        }
    }else if (indexPath.section == 2 ){
        if (indexPath.row==0 | indexPath.row ==1) {

            UITextField *textField = [[UITextField alloc] init];
            // Set a unique tag on each text field
            textField.tag = 3+ indexPath.row;
            // Add general UITextAttributes if necessary
            textField.enablesReturnKeyAutomatically = YES;
            textField.autocorrectionType = UITextAutocorrectionTypeNo;
            textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
            [cell.contentView addSubview:textField];
        }else{

        }
    }
}
//cell.textLabel.text=@"wqewq";
//cell.textLabel.text = [[listOfsections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

[self configureCell:cell atIndexPath:indexPath];



return cell;
}

- (void)configureCell:(UITableViewCell *)theCell atIndexPath:(NSIndexPath *)indexPath {

if (indexPath.section == 0) {

    // Get the text field using the tag
    UITextField *textField = (UITextField *)[theCell.contentView viewWithTag:1+indexPath.row];
    // Position the text field within the cell bounds
    CGRect cellBounds = theCell.bounds;
    CGFloat textFieldBorder = 10.f;
    // Don't align the field exactly in the vertical middle, as the text
    // is not actually in the middle of the field.
    CGRect aRect = CGRectMake(textFieldBorder, 9.f, CGRectGetWidth(cellBounds)-(2*textFieldBorder), 31.f );

    textField.frame = aRect;

    theCell.textLabel.text = NULL;


    // Configure UITextAttributes for each field
    if(indexPath.section == 0 & indexPath.row == 0) {
        textField.placeholder = @"Name";
        textField.returnKeyType = UIReturnKeyNext;
        textField.autocapitalizationType = UITextAutocapitalizationTypeWords;
    } else if(indexPath.section == 0 & indexPath.row == 1) {
        textField.placeholder = @"Price";
        textField.returnKeyType = UIReturnKeyNext;
        textField.keyboardType = UIKeyboardTypeNumberPad;
    }else if (indexPath.section ==0 & indexPath.row >1){
        [textField removeFromSuperview];
    }
}else if (indexPath.section == 1) {

    // Get the text field using the tag
    UITextField *textField = (UITextField *)[theCell.contentView viewWithTag:2+indexPath.row];
    // Position the text field within the cell bounds
    CGRect cellBounds = theCell.bounds;
    CGFloat textFieldBorder = 10.f;
    // Don't align the field exactly in the vertical middle, as the text
    // is not actually in the middle of the field.
    CGRect aRect = CGRectMake(textFieldBorder, 9.f, CGRectGetWidth(cellBounds)-(2*textFieldBorder), 31.f );

    textField.frame = aRect;

    // Configure UITextAttributes for each field
    if(indexPath.section == 1 & indexPath.row == 0) {
        textField.placeholder = @"Year";
        textField.returnKeyType =UIReturnKeyDone;
        textField.autocapitalizationType = UIKeyboardTypeNumberPad;
        theCell.textLabel.text = NULL;
    }else if(indexPath.section == 1 & indexPath.row != 0){
        [textField removeFromSuperview];
        theCell.textLabel.text = [[listOfsections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

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

    // Get the text field using the tag
    UITextField *textField = (UITextField *)[theCell.contentView viewWithTag:3+indexPath.row];
    // Position the text field within the cell bounds
    CGRect cellBounds = theCell.bounds;
    CGFloat textFieldBorder = 10.f;
    // Don't align the field exactly in the vertical middle, as the text
    // is not actually in the middle of the field.
    CGRect aRect = CGRectMake(textFieldBorder, 9.f, CGRectGetWidth(cellBounds)-(2*textFieldBorder), 31.f );

    textField.frame = aRect;

    // Configure UITextAttributes for each field
    if(indexPath.section == 2 & indexPath.row == 0) {
        textField.placeholder = @"Keyword1";
        textField.returnKeyType =UIReturnKeyDone;
        textField.autocapitalizationType = UIKeyboardTypeNumberPad;
    }else if(indexPath.section == 2 & indexPath.row == 1) {
        textField.placeholder = @"Keyword2";
        textField.returnKeyType =UIReturnKeyDone;
        textField.autocapitalizationType = UIKeyboardTypeNumberPad;
    }else{}
}



}

固定!如果有人有同样的问题(工作代码)

static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    // Add a UITextField
    UITextField *textField = [[UITextField alloc] init];
    // Set a unique tag on each text field
    textField.tag = 1 + indexPath.row;
    textField.delegate=self;
    // Add general UITextAttributes if necessary
    textField.enablesReturnKeyAutomatically = YES;
    textField.autocorrectionType = UITextAutocorrectionTypeNo;
    textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
    // Position the text field within the cell bounds
    CGRect cellBounds = cell.bounds;
    CGFloat textFieldBorder = 10.f;
    // Don't align the field exactly in the vertical middle, as the text
    // is not actually in the middle of the field.
    CGRect aRect = CGRectMake(textFieldBorder, 9.f, CGRectGetWidth(cellBounds)-(2*textFieldBorder), 31.f );

    textField.frame = aRect;

    textField.placeholder = @"Search for an item";
    textField.returnKeyType = UIReturnKeyDefault;
    textField.autocapitalizationType = UITextAutocapitalizationTypeWords;

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

            [cell.contentView addSubview:textField];
            cell.textLabel.text=NULL;
        }else{
            [textField removeFromSuperview];
            cell.textLabel.text = [[sections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
        }

1 个答案:

答案 0 :(得分:0)

表格不会使单元格重叠,但 单元格会重复使用。您的问题是您只在初始化时配置单元格。实际上,无论是创建新单元格还是从-dequeueReusableCellWithIdentifier:获取旧单元格,都需要执行该配置。

也许您认为表视图会保存您提供的每个单元格?这不是它的工作方式......可重复使用的单元格意味着一个表只需要一次可以显示的单元格数量。滚动视图时,从顶部或底部滚动的单元格将作为新内容的新单元格进行回收。但是,您没有设置新内容,因此旧内容会显示出来。

if的第一行后添加一个小括号,以便始终执行其余代码:

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

if (indexPath.section == 0) {