UITableView 单元格中的 UITextField 与 shouldChangeCharactersInRange 行为异常

UITextField in UITableView cell behaving strangely with shouldChangeCharactersInRange

我在自定义 UITableViewCell 中将自定义委托与我的 UITextField 结合使用。基本上我的 UITableView 上有 UITextFields,在编辑模式下,我希望能够编辑 UITextField 中的内容。

我的问题是,当我进入编辑模式并尝试在文本字段中键入内容时,我只能键入一个字符,而且它会加倍。在此示例中,我尝试键入 "p",它只允许我键入 "p",然后它变为 "pp"。

这是我的代码。仅供参考,我对 iOS/programming/custom delegation/custom UITableViewCells 很陌生。

UITableViewCell 子类.h:

@protocol MenuTableViewCellDelegate <NSObject>

- (void)updatedFoodItem:(NSString *)foodItem fromCell:(id)sender;

@end

@interface MenuTableViewCell : UITableViewCell <UITextFieldDelegate>
@property (nonatomic, weak) id <MenuTableViewCellDelegate> delegate;
@property (weak, nonatomic) IBOutlet UITextField *foodTextField;
@property (weak, nonatomic) IBOutlet UITextField *priceTextField;

@end

UITableViewCell.m:

- (void)awakeFromNib {
    self.foodTextField.delegate = self;
}
// Delegate method for tableview cell - food item text field is within cell.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    [self.delegate updatedFoodItem:string fromCell:self];
    return YES;
}

在我的 ViewController.m 中:

- (void)updatedFoodItem:(NSString *)foodItem fromCell:(MenuTableViewCell *)cell
{
    NSIndexPath *p = [self.menuTableView indexPathForCell:cell];
    id item = self.menuItemsArray[p.row];
    cell.foodTextField.text = foodItem;
}

顺便说一下,我意识到上面可能还没有更新我的数据,我还没有弄清楚所以任何建议都很好。

问题是您在 shouldChangeCharactersInRange: 中调用 updatedFoodItem: 方法 然后 returning YES功能。本质上发生的事情是:

1 - shouldChangeCharactersInRange: 被调用

2 - 此函数调用 updatedFoodItem:

3 - updatedFoodItem: 函数将 cell 的文本字段设置为传入

的原始文本

4 - shouldChangeCharactersInRange: 方法 returns YES,将刚刚在 updatedFoodItem: 函数中设置的相同文本附加到单元格的标签

我不确定你到底想做什么(也许你想把食物保存到你的self.menuItemsArray?),但你不应该在updatedFoodItem: 函数,或者你应该 return NO 在你的 shouldChangeCharactersInRange: 函数中。