UITableViewCell显示双嵌入式UITextfields

时间:2012-06-19 06:15:07

标签: iphone uitableview

我有一个带有常规UITableViewCell的UITableView,但我没有使用任何UITableViewCell的标签。我只是使用单元格嵌入标签和UITextField来输入一些数据。问题是当你向上滚动或向下滚动并且UITableviewCell重绘自己时,它会在旧的上面绘制重叠的UITextFieldView,你会看到双打!我想也许因为我把这些UITextField放到字典中,它可能会用强指针保存文本字段,并尝试制作另一个并且只是重叠。有人有什么建议吗?

这是我的代码:

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

NSDictionary *product = [self.products objectAtIndex:indexPath.row];
NSDictionary *orderpoint = [self.orderpoints objectAtIndex:indexPath.row];

cell.textLabel.text = @""; //black out text

CGFloat calculatedHeight = [self tableView:tableView heightForRowAtIndexPath:indexPath];
UILabel *productLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.bounds.size.width - 50.0, calculatedHeight)];

productLabel.text = [[NSString alloc] initWithFormat:@"%@. %@",
                       [orderpoint objectForKey:@"sequence_nr"], [product objectForKey:@"name"]];
//word wrapping
productLabel.lineBreakMode = UILineBreakModeWordWrap;
productLabel.numberOfLines = 0; //infinite number of lines
productLabel.font = [UIFont fontWithName:@"Helvetica" size:14.0];

[cell.contentView addSubview:productLabel];

 //create the cell's textfield
UITextField *cellTextField = [[UITextField alloc] initWithFrame:CGRectMake(cell.bounds.size.width - 50, cell.bounds.size.height - 30, 50, calculatedHeight - 20)];
cellTextField.adjustsFontSizeToFitWidth = YES;
cellTextField.textColor = [UIColor blackColor];
cellTextField.keyboardType = UIKeyboardTypeNumberPad; // will only need to end a count
cellTextField.returnKeyType = UIReturnKeyDone; // TODO make it go to the next items key, or make it exit out
cellTextField.backgroundColor = [UIColor whiteColor];
cellTextField.textAlignment = UITextAlignmentLeft; //align to the right
//cellTextField.delegate = self; //will need to set delegate, maybe
cellTextField.clearButtonMode = UITextFieldViewModeNever;
cellTextField.enabled = YES;
cellTextField.borderStyle = UITextBorderStyleRoundedRect; //add bezel rounded look to textfield
cellTextField.delegate = self;

[cell.contentView addSubview: cellTextField]; //add the textfield to the cell
// save to dictionary, using a dictionary because not certain if this is created in order to use an Array
[self.textFieldDict setObject:cellTextField forKey:[[NSNumber alloc] initWithInteger:indexPath.row]];

return cell;
}

4 个答案:

答案 0 :(得分:0)

您尚未初始化您的单元格。请尝试:

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

//It will check whether cell in there or not, then deque the cell...
    if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }

    NSDictionary *product = [self.products objectAtIndex:indexPath.row];
    NSDictionary *orderpoint = [self.orderpoints objectAtIndex:indexPath.row];

    cell.textLabel.text = @""; //black out text

    CGFloat calculatedHeight = [self tableView:tableView heightForRowAtIndexPath:indexPath];
    UILabel *productLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.bounds.size.width - 50.0, calculatedHeight)];

    productLabel.text = [[NSString alloc] initWithFormat:@"%@. %@",
                           [orderpoint objectForKey:@"sequence_nr"], [product objectForKey:@"name"]];
    //word wrapping
    productLabel.lineBreakMode = UILineBreakModeWordWrap;
    productLabel.numberOfLines = 0; //infinite number of lines
    productLabel.font = [UIFont fontWithName:@"Helvetica" size:14.0];

    [cell.contentView addSubview:productLabel];

     //create the cell's textfield
    UITextField *cellTextField = [[UITextField alloc] initWithFrame:CGRectMake(cell.bounds.size.width - 50, cell.bounds.size.height - 30, 50, calculatedHeight - 20)];
    cellTextField.adjustsFontSizeToFitWidth = YES;
    cellTextField.textColor = [UIColor blackColor];
    cellTextField.keyboardType = UIKeyboardTypeNumberPad; // will only need to end a count
    cellTextField.returnKeyType = UIReturnKeyDone; // TODO make it go to the next items key, or make it exit out
    cellTextField.backgroundColor = [UIColor whiteColor];
    cellTextField.textAlignment = UITextAlignmentLeft; //align to the right
    //cellTextField.delegate = self; //will need to set delegate, maybe
    cellTextField.clearButtonMode = UITextFieldViewModeNever;
    cellTextField.enabled = YES;
    cellTextField.borderStyle = UITextBorderStyleRoundedRect; //add bezel rounded look to textfield
    cellTextField.delegate = self;

    [cell.contentView addSubview: cellTextField]; //add the textfield to the cell

    return cell;
    }

答案 1 :(得分:0)

要么不使用可重用性,要么每次都分配单元格或

出列后进行检查(像这样)

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if(cell==nil)
{
  // make text field and label an add tag
}

//and outside this by using tag fetch the labels and textField and clear the textFields.

答案 2 :(得分:0)

你忘记了这样的条件:

if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier];
         }

答案 3 :(得分:0)

将此作为参考:add subviews to UITableViewCell

我刚刚检查过以前是否添加了此视图,如果是,则不要再添加。它与细胞无关。除非我错过了什么?我所知道的是,现在这似乎工作正常。

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

NSDictionary *product = [self.products objectAtIndex:indexPath.row];
NSDictionary *orderpoint = [self.orderpoints objectAtIndex:indexPath.row];

cell.textLabel.text = @""; //black out text

CGFloat calculatedHeight = [self tableView:tableView heightForRowAtIndexPath:indexPath];
UILabel *productLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.bounds.size.width - 50.0, calculatedHeight)];

productLabel.text = [[NSString alloc] initWithFormat:@"%@. %@",
                       [orderpoint objectForKey:@"sequence_nr"], [product objectForKey:@"name"]];
//word wrapping
productLabel.lineBreakMode = UILineBreakModeWordWrap;
productLabel.numberOfLines = 0; //infinite number of lines
productLabel.font = [UIFont fontWithName:@"Helvetica" size:14.0];

[cell.contentView addSubview:productLabel];

if (![cell viewWithTag:1])
{
    //create the cell's textfield
    UITextField *cellTextField = [[UITextField alloc] initWithFrame:CGRectMake(cell.bounds.size.width - 50, cell.bounds.size.height - 30, 50, calculatedHeight - 20)];
    cellTextField.adjustsFontSizeToFitWidth = YES;
    cellTextField.textColor = [UIColor blackColor];
    cellTextField.keyboardType = UIKeyboardTypeNumberPad; // will only need to end a count
    cellTextField.returnKeyType = UIReturnKeyDone; // TODO make it go to the next items key, or make it exit out
    cellTextField.backgroundColor = [UIColor whiteColor];
    cellTextField.textAlignment = UITextAlignmentLeft; //align to the right
    cellTextField.delegate = self; //will need to set delegate, maybe
    cellTextField.clearButtonMode = UITextFieldViewModeNever;
    cellTextField.enabled = YES;
    cellTextField.borderStyle = UITextBorderStyleRoundedRect; //add bezel rounded look to textfield
    cellTextField.delegate = self;

    cellTextField.tag = 1; //set tag to 1

    [cell.contentView addSubview: cellTextField]; //add the textfield to the cell
    // save to dictionary, using a dictionary because not certain if this is created in order to use an Array
    [self.textFieldDict setObject:cellTextField forKey:[[NSNumber alloc] initWithInteger:indexPath.row]];
}

return cell;

}