表格视图中的单元格重叠



我试图用单元格和文本字段实现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];
        }

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

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

if的第一行后面添加一个右括号,这样代码的其余部分总是执行的:

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

最新更新