如何使用自定义inputView获取UITextFieldDelegate.shouldChangeCharactersInRange?

时间:2011-01-12 21:01:44

标签: ios delegates uitextfield

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

- (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];
}

3 个答案:

答案 0 :(得分:11)

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

您可以获得UIControlEventEditingChanged的事件UITextField。因此,您应该依赖于此事件,而不是依赖于shouldChangeCharactersInRange方法(此外已知有错误),每次用户更改文本字段的内容时都会触发此事件。

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

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

[textField sendActionsForControlEvents:UIControlEventTouchUpInside];

答案 1 :(得分:0)

编辑:抱歉,之前误解了您的问题。

当文本字段从系统键盘输入时调用shouldChangeCharactersInRange,让您有机会确定文本是否应该实际显示(例如,您可以实现它以识别快捷方式并插入一些较长的文本)。但是文本字段无法将自定义视图中的输入识别为文本输入。

如果您有自定义inputView,则无需调用此方法 - 只需直接从IBAction更新文本字段:

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

答案 2 :(得分:0)

我知道这是一个老问题,但我遇到了需要支持5.0之前设备的同样问题。如果你覆盖insertText:按照Rob http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html的说明,那么每次都会触发shouldChangeCharactersInRange。

如果您需要像我一样支持退格键,您可以使用How to simulate the delete key on UITextField?上的@cormacrelf的答案

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