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:
函数中。
我在自定义 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:
函数中。