UITextField占位符在点击时保持显示

时间:2011-06-11 21:15:28

标签: ios uitextfield placeholder

我有一个包含3行的表格视图。每行都有相同的自定义tableviewcell和uitextfield,但占位符属性不同。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"NewDestinationCell";

    NewDestinationCell *cell = (NewDestinationCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        [cellNib instantiateWithOwner:self options:nil];
        cell = editCell;
        self.editCell = nil;
        cell.detailTextField.delegate = self;
        cell.detailTextField.tag = indexPath.row;
        [cell.detailTextField setInputAccessoryView:keybdToolbar];
    }
    if ([[textFieldStrings objectAtIndex:indexPath.row] length] != 0) 
        cell.detailTextField.text = [textFieldStrings objectAtIndex:indexPath.row];
    return cell;
}

当我点击文本字段并输入一些文本时,转到另一个文本字段,然后返回文本字段并输入我的文本,它会删除我键入的内容并改为放置占位符文本。我是否必须实现commitEditingStyle方法?每个表行中的文本字段链接到相同的uitextfield出口。也许这就是为什么?这是我用来遍历三行的代码。

- (void)textFieldDidBeginEditing:(UITextField *)textField {
        [textField becomeFirstResponder];
    textField.text = [textFieldStrings objectAtIndex:textField.tag];
    currTextField = textField;
    if (currTextField.tag == [self.tableView numberOfRowsInSection:0]-1) {
        NextButton.enabled = NO;
        PrevButton.enabled = YES;
    }
    if (currTextField.tag == 0) {
        PrevButton.enabled = NO;
        NextButton.enabled = YES;
    }

}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [textFieldStrings replaceObjectAtIndex:textField.tag withObject:textField.text];
    [textField resignFirstResponder];
}


- (IBAction)PrevTextField:(id)sender {
    [tableViewCellFields[currTextField.tag-1] becomeFirstResponder];
}

- (IBAction)NextTextField:(id)sender {
    [tableViewCellFields[currTextField.tag+1] becomeFirstResponder];
}

1 个答案:

答案 0 :(得分:1)

说实话,IBOutlet有点令人困惑。但是这里存在一些问题,其中一个是细胞再利用。

由于单元格被重用,您不应该依赖文本保留它们的值,而应该存储在textFieldDidEndEditing:方法中键入的内容。为输入或未输入的值维护一个数组(使用[NSNull null]单例)。在cellForRowAtIndexPath:方法中,如果您看到现有文本值,则将文本字段的文本设置为该值。这样就可以抵消细胞再利用效应。

另一个问题是插座StreetName。创建单元格时,我猜StreetName将指向正确的文本字段,但重复使用单元格时会发生什么。 StreetName将指向已创建的最后一个单元格的文本字段,因此您在cellForRowAtIndexPath:中执行的所有分配对于重用的单元格都不正确。如果您创建UITableViewCell的自定义子类,将会更容易,cell.myTextField.text = [textFieldStrings objectAtIndex:indexPath.row];

作为旁注,

StreetName.delegate = self;
StreetName.tag = indexPath.row;
tableViewCellFields[indexPath.row] = StreetName;
[StreetName setInputAccessoryView:keybdToolbar];

第一行和最后一行是您在创建单元格时只需执行一次的操作。