2011-01-12 1 views
8

У меня есть пользовательская клавиатура, которую я использую для редактирования текста в mytextField, и он отлично работает. Тем не менее, я никогда не могу заставить делегата shouldChangeCharactersInRange выполнить свою собственную клавиатуру. Он выполняется, когда я использую свою фактическую клавиатуру (очевидно, это не клавиатура iPhone по умолчанию, поскольку у меня установлен mytextField.inputView = numberPad.view). Что мне делать, чтобы заставить делегата shouldChangeCharactersInRange запускать пользовательскую клавиатуру? BTW, пользовательская клавиатура - это всего лишь пучок кнопок.Как я могу заставить UITextFieldDelegate.shouldChangeCharactersInRange запускать пользовательский inputView?

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

ответ

0

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

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

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

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

Я только что проверил, используя ваше предложение выше, но все равно shouldChangeCharactersInRange не срабатывал при вызове numberPadPressed. Я думаю, что мы на правильном пути ... – docchang

+0

Как рассчитать диапазон? Есть ли способ переместить курсор в любую конкретную позицию в TextField? – docchang

+0

Я обновил образец кода. Используйте [mytextField selectedRange], чтобы получить выбранный диапазон, который будет просто точкой вставки, если нет выбора, или будет диапазон символов, если есть выбор. –

10

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

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

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

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

[textField sendActionsForControlEvents:UIControlEventTouchUpInside]; 
+0

Ваш 'forControlEvents' должен соответствовать вашему 'sendActionsForControlEvents' –

0

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

Если затем необходимо поддерживать клавишу возврата, как я вы можете использовать ответ от @cormacrelf на How to simulate the delete key on UITextField?

только запутать я не был в состоянии работать вокруг в том, что при удалении персонажа из в середине строки курсор возвращается к концу строки.

Смежные вопросы