我这里有一个奇怪的问题。我有一个使用自定义 UITableViewCells 的 UITableView。除了特定问题之外,一切都按预期进行。
场景如下:
我需要在编辑开始之前删除 UITextField 中的“$”符号。这是通过 textFieldShouldBeginEditing:
方法完成的。
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
LifeEarningsLineItemTableViewCell *cell = (LifeEarningsLineItemTableViewCell *)[self tableViewCellContainingObject:textField inTableView:self.lifeEarningsTableView];
if (textField == cell.itemAmount) {
/*Remove currency symbol for editing.*/
NSString *currencySymbol = [self.currencyFormatter currencySymbol];
NSMutableString *mutableText = [NSMutableString stringWithString:textField.text];
[mutableText replaceOccurrencesOfString:currencySymbol withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableText length])];
textField.text = mutableText;
}
return YES;
}
问题是这样的:
- 在不同行之间,从textField1移动到textField2(在不同的行中),“$”被删除,这是好 .
- 在同一行中,从textField1移动到textField2,“$”没有被删除,这是不好。
为什么同一行中的“$”没有被删除,而是不同行中的“$”被删除?
以下是该问题的直观表示:
[编辑...添加]
我通过这些流程获取这些日志:
应该开始......行:0,标签:0
应该开始......行:0,标签:1
已结束......行:0,标签:0
已结束......行:0,标签:1
应该开始......行:0,标签:0
应该开始......行:1,标签:1
已结束......行:0,标签:0
已结束......行:1,标签:1
此外,这里是 tableViewCellContainingObject:inTableView:tableView
方法:
- (UITableViewCell *)tableViewCellContainingObject:(UIView *)view inTableView:(UITableView *)tableView {
CGPoint objectRectInTableViewCoordinates = [tableView convertPoint:view.bounds.origin fromView:view];
NSIndexPath *cellIndexPath = [tableView indexPathForRowAtPoint:objectRectInTableViewCoordinates];
return [tableView cellForRowAtIndexPath:cellIndexPath];
}
以及 textFieldDidEndEditing
方法:
- (void)textFieldDidEndEditing:(UITextField *)textField {
LifeEarningsLineItemTableViewCell *cell = (LifeEarningsLineItemTableViewCell *)[self tableViewCellContainingObject:textField inTableView:self.lifeEarningsTableView];
LifeEarningsLineItem *lifeEarningsLineItem = [self.lifeEarningsFetchedResultsController objectAtIndexPath:[self.lifeEarningsTableView indexPathForCell:cell]];
if (textField == cell.itemAmount) {
NSNumber *absInteger = [NSNumber numberWithInteger:abs([textField.text integerValue])];
textField.text = [self.currencyFormatter stringFromNumber:absInteger];
lifeEarningsLineItem.amount = absInteger;
[self sumAmountsAndDisplay];
} else if (textField == cell.itemName) {
lifeEarningsLineItem.name = textField.text;
}
}
最佳答案
我认为你的解决方案(在编辑过程中解耦 FRC)可能有点激烈,并且可能会产生不可预见的影响。这里有一些替代建议。我假设问题是由在完成单元格中第一个字段的编辑后表格重新加载您正在编辑的行引起的。
- 如果文本字段未进行编辑,请不要将货币符号存储在模型中,而是将其添加到 cellForRowAtIndexPath 中显示的文本中。当文本字段开始编辑时,将其文本直接设置为模型中的值。您无需在最终编辑中执行任何操作,因为重新加载将为您重新添加货币符号。
- 如果您不想更改模型,则可以执行类似的操作 - 如果单元格正在编辑,则在 cellForRowAtIndexPath 中删除货币符号。
- 存储当前编辑行的索引路径,并有条件地忽略 FRC 委托(delegate)方法中对此行的更改。
关于ios - 使用自定义 UITableViewCell 时,在编辑之前更改 UITextField 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9895699/