2012-03-27 76 views
3

我在这里有一个奇怪的问题。我有一个使用自定义UITableViewCells的UITableView。除特殊问题外,一切都按预期工作。当使用自定义UITableViewCell编辑之前更改UITextField文本

这里的情景:

我需要删除“$”符号为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会移动到文字栏(在不同行)中, “$” 去除,这是GOOD
  • 相同行,从移动到textField1的文字栏位中, “$” 删除,这是BAD

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

这里是问题的可视化表示:Issue

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

Flow1
应该开始.....行:0,标签:0
应该开始.....行:0,标记:1
DID END .....行:0,标记:0
DID END .....行:0 ,标签:1

Flow2
应该开始.....行:0,标签:0
应该开始.....行:1,标签:1
DID END .....行: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; 
    } 
} 
+0

那么,它唯一可能的是由于某种原因(你不显示代码)'tableViewCellContainingObject:inTableView:'在这种情况发生时没有返回正确的单元格。 – lnafziger 2012-03-27 20:13:34

+0

我通过'indexPathForCell:'通过日志语句检查过。它不仅记录了正确的行,还通过'theTextField.text'为这些UITextFields记录了正确的值。从上面的代码中,当我登录'textField.text'时,它实际上记录了正确的文本(没有“$”)!然而,它在视觉上显示“$”符号。仅供参考,这是通过模拟器(iOS 5.1)。 – Gobot 2012-03-27 20:35:07

+1

如果您记录'textField.text'并显示正确的值,是否有机会从另一行删除$? – lnafziger 2012-03-27 20:56:14

回答

1

我认为你的解决方案(在编辑过程中解耦FRC)可能有点激烈,可能会有不可预见的影响。这里有几个替代建议。我假设问题是由于在完成编辑单元格中的第一个字段后重新加载正在编辑的行所导致的。

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

具体是第一个要点。我已经将一个NSNumber存储到我的模型中(即不保存$)。但是,如果**文本字段不是editing_“,则建议”将其添加到cellForRowAtIndexPath中显示的文本中**“,如果**是一种很好的简单方法。我完全忽略了这是一个检查文本字段是否正在编辑的好地方。因此,在我的'configureCell'(在​​'cellForRowAtIndexPath'中调用),新编辑的行:'if(lifeEarningsLineItemCell.itemAmount.editing == NO)lifeEarningsLineItemCell.itemAmount.text = [self.currencyFormatter stringFromNumber:lifeEarningsLineItem.amount];'。谢谢。 – Gobot 2012-03-28 12:50:51

+0

乐意提供帮助。我知道整天盯着一个问题并错过一个明显的解决方案的感觉! – jrturton 2012-03-28 13:18:49

0

好的,我想通了这个问题......这是天才代织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)。

+0

很高兴你能解决这个问题,但我同意你对解决方案的关注。如果您在编辑过程中离开应用程序或切换到另一个选项卡,会发生什么情况,键盘是否关闭,FRC代表会重新连接? – jrturton 2012-03-28 06:03:34

相关问题