UITextField占位符文本叠加问题

时间:2014-01-26 20:00:07

标签: ios objective-c uitableview uitextfield

我有一个包含三个表视图单元格的表视图。 在单元格配置期间,我向每个单元格添加一个UITextField,并且还在所有文本字段上设置占位符值。 当表视图加载时,最终结果如下所示:

Table view after load

我遇到的问题是,当我再次出现“屏幕外”的任何单元格时,占位符文本变得越来越暗,就像这里:

Darker placeholder text

当我尝试通过在其中键入名称来更改UITextField字符串值,或者通过以编程方式更改最后一个单元格上的占位符值时,这些属性的旧值保留,并且新值将覆盖在单元格中,如这样:

enter image description here

以下是负责配置这些单元格的方法:

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

    // Configure the cell...
    [self configureCell:cell forIndexPath:indexPath];

    return cell;
}

- (void)configureCell:(UITableViewCell *)cell forIndexPath:(NSIndexPath *)indexPath
{
    for (UIView *subview in cell.contentView.subviews) {
        [subview removeFromSuperview];
    }

    cell.backgroundColor = [UIColor whiteColor];
    cell.autoresizesSubviews = YES;
    cell.clearsContextBeforeDrawing = YES;
    CGRect textFieldFrame = cell.bounds;
    textFieldFrame.origin.x += 10;
    textFieldFrame.size.width -= 10;

    UITextField *textField = [[UITextField alloc] initWithFrame:textFieldFrame];
    textField.adjustsFontSizeToFitWidth = YES;
    textField.textColor = [UIColor lightGrayColor];
    textField.enabled = YES;
    textField.userInteractionEnabled = NO;
    textField.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    textField.clearsContextBeforeDrawing = YES;
    textField.clearsOnBeginEditing = YES;

    if (indexPath.section == ATTAddNewTimerSectionName) {
        textField.placeholder = @"Name";
        textField.userInteractionEnabled = YES;
        textField.delegate = self;
        textField.returnKeyType = UIReturnKeyDone;
        textField.clearButtonMode = UITextFieldViewModeWhileEditing;
    } else if (indexPath.section == ATTAddNewTimerSectionDate) {
        textField.placeholder = @"Date/Time";
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    } else if (indexPath.section == ATTAddNewTimerSectionCalendar) {
        if (self.userCalendarEvent == nil) {
            textField.placeholder = @"See list of calendar events";
        } else {
            textField.placeholder = nil;
            textField.placeholder = self.userCalendarEvent.title;
        }
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    [cell addSubview:textField];
}

正如你所看到的,我尝试了各种各样的事情,比如在向单元格添加新视图或在单元格和UITextView上设置 - [UIView setClearsContextBeforeDrawing:YES]之前删除所有子视图,甚至将占位符值设置为没有成功,没有。

任何指针都会非常感激!

1 个答案:

答案 0 :(得分:2)

你正在犯这么多人所犯的经典错误。当表格滚动时,单元格会被重用。

如上所述,每次使用单元格时,您的代码都会不断创建和添加新的文本字段。因此,您将看到在单元格中包含多个文本字段的结果。

您只想向单元格添加一个文本字段。更新您的代码,以便它只添加文本字段(如果它已经存在)。

您的代码中似乎存在逻辑问题。您可以将文本字段直接添加到单元格,但是您尝试将其从单元格contentView中删除。

改变这个:

[cell addSubview:textField];

为:

[cell.contentView addSubview:textField];