繁体   English   中英

使用自定义UITableViewCell时,在编辑之前更改UITextField文本

[英]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;
}  

这是问题所在:

  • 不同的行之间,从textField1移动到textField2(在不同的行中),“$” 删除,这是好的
  • 同一行,从移动到textField1的文字栏位中,“$” 除,这是不好的。

为什么“$”不会在同一行中删除,而是在不同的行中删除?

以下是该问题的直观表示: 问题

[编辑... ADDITION]
我用这些流程得到这些日志:

流1
应该开始.....行: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)可能有点激烈,并且可能产生无法预料的影响。 以下是一些替代建议。 我假设问题是由完成编辑单元格中第一个字段后重新加载正在编辑的行的表引起的。

  • 如果文本字段未编辑,请不要将货币符号存储在模型中,将其添加到cellForRowAtIndexPath中显示的文本中。 文本字段开始编辑时,将其文本直接从模型设置为值。 您无需在结束编辑中执行任何操作,因为重新加载将为您重新添加货币符号。
  • 如果您不想更改模型,您可以执行类似的操作 - 在cellForRowAtIndexPath中,如果单元格正在编辑,则删除货币符号。
  • 存储当前编辑行的索引路径,并有条件地忽略FRC委托方法中对此行的更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM