我有一个包含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];
}
说实话,IBOutlet
有点令人困惑。但这里也有一些问题,其中之一就是细胞复用。
由于单元格是重复使用的,所以不应该依赖于文本来保留它们的值,而应该将键入的内容存储在textFieldDidEndEditing:
方法中。为输入或未输入的值维护一个数组(使用[NSNull null]
singleton)。在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];
第一行和最后一行是在创建单元格时只需要执行一次的操作。