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

doc*_*ang 9 delegates uitextfield ios

我有一个自定义键盘,我用来编辑文本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];
}
Run Code Online (Sandbox Code Playgroud)

jpt*_*ung 11

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

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

[textField addTarget:self action:@selector(myTextfieldChangedMethod:) forControlEvents:UIControlEventEditingChanged];
Run Code Online (Sandbox Code Playgroud)

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

[textField sendActionsForControlEvents:UIControlEventTouchUpInside];
Run Code Online (Sandbox Code Playgroud)


Chr*_*lay 0

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

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

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

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