【发布时间】:2012-03-27 18:48:41
【问题描述】:
我在这里遇到了一个奇怪的问题。我有一个使用自定义 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(在不同的行中),“$”被删除,这是 GOOD .
- 在同一行中,从 textField1 移动到 textField2,“$”没有被删除,这是 BAD。
为什么“$”不是在同一行中被删除,而是在不同的行中删除?
这是问题的直观表示:
[编辑...添加]
我通过这些流程获得了这些日志:
应该开始.....行:0,标签:0
应该开始.....行:0,标签:1
DID END .....行:0,标签:0
DID END .....行:0,标签:1
应该开始.....行:0,标签:0
应该开始.....行:1,标签:1
DID END .....行:0,标签:0
DID END .....行: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;
}
}
【问题讨论】:
-
好吧,唯一的可能是由于某种原因(您没有显示它的代码)
tableViewCellContainingObject: inTableView:在发生这种情况时没有返回正确的单元格。 -
我通过
indexPathForCell:的日志语句检查了这一点。它不仅记录了正确的行,还通过theTextField.text记录了那些 UITextFields 的正确值。从上面的代码中,当我登录textField.text时,它实际上记录了正确的文本(没有“$”)!然而,它在视觉上显示了“$”符号。仅供参考,这是通过模拟器(iOS 5.1)。 -
如果您记录
textField.text并显示正确的值,是否会从不同的行中删除 $? -
好吧,当你改变文本时 UITextField 会刷新它的视图....
-
所以我猜你是用
textFieldShouldEndEditing重新添加$?真的,唯一有意义的是它作用于错误的行,当它在错误的行上结束编辑时,它会重新添加 $ 。打破这两个函数,看看它们在什么时候被调用了多少次你试一下。我猜当你直接穿过时,你会得到一个结束,然后是一个开始,但是当你切换时,你会得到一个结束,一个开始和一个结束。
标签: ios uitableview uitextfield