Как я могу получить UITextFieldDelegate.shouldChangeCharactersInRange для запуска с пользовательским inputViewView? - PullRequest
9 голосов
/ 13 января 2011

У меня есть пользовательская клавиатура, которую я использую для редактирования текста в 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 ]

11 голосов
/ 07 августа 2011

Вы никогда не получите shouldChangeCharactersInRange, вызванный с помощью пользовательской клавиатуры.

То, что вы можете получить, это событие UIControlEventEditingChanged из UITextField. Поэтому вместо того, чтобы полагаться на метод shouldChangeCharactersInRange (который, как известно, содержит ошибки), вы должны полагаться на это событие, которое будет запускаться каждый раз, когда пользователь изменяет содержимое текстового поля.

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

Если вы изменяете текстовое поле с помощью пользовательской клавиатуры, просто вызовите этот метод, чтобы уведомить всех слушателей о событии UIControlEventEditingChanged.

[textField sendActionsForControlEvents:UIControlEventTouchUpInside];
0 голосов
/ 03 июля 2012

Я знаю, что это старый вопрос, но я столкнулся с той же проблемой при необходимости поддержки устройств до версии 5.0. Если вы переопределите insertText: следуя инструкциям Роба на http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html, то вы получите firstChangeCharactersInRange для запуска каждый раз.

Если вам потребуется поддержка клавиши возврата, как я, вы можете использовать ответ @cormacrelf по адресу Как смоделировать клавишу удаления в UITextField?

Единственное snafu, с которым я не смог обойти это то, что когда вы удаляете символ из середины строки, курсор возвращается к концу строки.

0 голосов
/ 26 января 2011

Редактировать: извините, неправильно понял ваш вопрос ранее.

Ваше текстовое поле вызывает shouldChangeCharactersInRange, когда оно получает ввод с системной клавиатуры , давая вам возможность определить, должен ли текст действительно отображаться (например, вы можете реализовать его для распознавания ярлыка и вставки немного более длинный текст). Но текстовое поле не распознает ввод из вашего пользовательского представления как ввод текста.

Если у вас есть собственный inputView, вам не нужно вызывать этот метод - просто обновите текстовое поле непосредственно из вашего IBAction:

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