[英]Change UITextField text right before editing when using custom UITableViewCell
我这里有一个奇怪的问题。 我有一个使用自定义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;
}
这是问题所在:
为什么“$”不会在同一行中删除,而是在不同的行中删除?
以下是该问题的直观表示:
[编辑... ADDITION]
我用这些流程得到这些日志:
应该开始.....行: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;
}
}
好吧,我想出了问题......这是gosh darn NSFetchedResultsController
委托方法,特别是NSFetchedResultsChangeUpdate
更改类型。 这不是第一次NSFetchedResultsController
走遍我的桌子。 我应该记得NSFetchedResultsController
与用户驱动的编辑不兼容。
所以这就是我如何解决这个问题(但我仍然担心整个事情都会崩溃):
由于事件的顺序......
SHOULD BEGIN.....Row:0, Tag:0
SHOULD BEGIN.....Row:0, Tag:1
DID END.....Row:0, Tag:0
DID END.....Row:0, Tag:1
...我不能只使用BOOL
属性来表示文本字段处于编辑模式(事件的顺序必须是BEGIN-> END-> BEGIN-> END)。
所以我创建了属性:
@property (nonatomic, strong) NSMutableSet *stackOfEditingTextFields;
然后在textFieldShouldBeginEditing:
方法的开头,我添加了:
/*Add text field to stack of editing text fields and disable the fetched results controller delegate.*/
[self.stackOfEditingTextFields addObject:textField];
self.lifeEarningsFetchedResultsController.delegate = nil;
然后在textFieldDidEndEditing:
方法的末尾,我添加了:
/*Remove text field from stack of editing text fields. If stack count is 0, reengage the fetched results controller delegate.*/
[self.stackOfEditingTextFields removeObject:textField];
if ([self.stackOfEditingTextFields count] == 0) self.lifeEarningsFetchedResultsController.delegate = self;
如果有一个更好的建议或任何我看不到的无法预见的副产品错误,我全都听见了。
感谢lnafziger的帮助,帮助我完成它,并建议不同的角度(我给你的评论+1)。
我认为你的解决方案(在编辑过程中解耦FRC)可能有点激烈,并且可能产生无法预料的影响。 以下是一些替代建议。 我假设问题是由完成编辑单元格中第一个字段后重新加载正在编辑的行的表引起的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.