我怎样才能得到UITextFieldDelegate.shouldChangeCharactersInRange与自定义inputView触发?

我有一个自定义的键盘,我用它来编辑mytextField的文本,它的效果很好。 但是,我永远不能得到shouldChangeCharactersInRange委托执行使用我的自定义键盘。 它执行时,我使用我的实际键盘(显然不是默认的iPhone键盘,因为我设置mytextField.inputView = numberPad.view)。 我该怎么做才能使用自定义键盘来触发shouldChangeCharactersInRange委托? 顺便说一句,自定义键盘只是一堆button。

 - (void) numberPadPressed: (UIButton *)sender { [mytextField insertText:[[NSNumber numberWithInt:sender.tag] stringValue]]; } - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string]; NSLog(@"shouldChangeCharactersInRange: %@", resultingString); return true; } - (void)viewDidLoad { mytextField.text = @""; mytextField.inputView = numberPad.view; mytextField.delegate = self; [mytextField becomeFirstResponder]; } 

您永远不会使用自定义键盘调用shouldChangeCharactersInRange

你可以得到的是UITextField的事件UIControlEventEditingChanged 。 因此,不应该依赖于shouldChangeCharactersInRange方法(也就是众所周知的bug),您应该依赖此事件,每当用户更改文本字段的内容时,都会触发此事件。

 [textField addTarget:self action:@selector(myTextfieldChangedMethod:) forControlEvents:UIControlEventEditingChanged]; 

如果使用自定义键盘修改文本字段,只需调用此方法通知事件UIControlEventEditingChanged所有侦听器。

 [textField sendActionsForControlEvents:UIControlEventTouchUpInside]; 

编辑:对不起,以前误解了你的问题。

您的文本字段在从系统键盘input时调用shouldChangeCharactersInRange ,给您一个机会来确定文本是否应该实际显示(例如,您可以实现它以识别快捷方式并插入一些更长的文本)。 但文本字段不能识别您的自定义视图的input作为文本input。

如果你有一个自定义的inputView,你不需要调用这个方法 – 只需要从你的IBAction直接更新文本字段:

 - (IBAction) numberPadPressed: (UIButton *)sender { NSString *newText = [[mytextField text] stringByReplacingCharactersInRange:[mytextField selectedRange] withString:string]; [mytextField setText:newText]; } 

我知道这是一个古老的问题,但我遇到了同样的问题需要支持pre 5.0设备。 如果你重写insertText:按照从http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html Rob的指示,那么你会得到shouldChangeCharactersInRange每一次触发。

如果您需要像我一样支持退格键,您可以使用@cormacrelf的答案如何模拟UITextField上的删除键?

我唯一无法解决的问题是当你从string中间删除一个字符时,光标会跳回到string的末尾。