UITextInputDelegate методы работают неправильно

Я работаю над расширением пользовательской клавиатуры iOS 8 прямо сейчас, и есть некоторые проблемы с использованием методов UITextInputDelegate.

Правильно ли это: selectionWillChange: and selectionDidChange: методы следует вызывать, когда пользователь нажимает на область ввода? И textWillChange: и textDidChange: методы должны вызываться всякий раз, когда текст буквально меняется?

Фактически, я заметил, что когда я изменил выделение в области ввода текста, вызываются textWillChange: и textDidChange: и я не могу понять, какие другие два метода вызывают в каком состоянии. Если кто-нибудь знает об использовании этих методов делегата, пожалуйста, дайте мне знать.

Ответ 1

Он не работает для меня тоже... то, что я сейчас делаю, это просто использовать textWillChange и textDidChange, который вызывает, как вы упомянули, при изменении вашего выбора... (они называются ПЕРЕД и ПОСЛЕ)

И затем сравниваем:
self.textDocumentProxy.documentContextBeforeInput
self.textDocumentProxy.documentContextAfterInput

От ПЕРЕД (textWillChange) в ПОСЛЕ (textDidChange), чтобы увидеть, изменился ли диапазон выбора или длина.


Что-то вроде этого (установите 4 NSStrings ниже в вашем файле .h, конечно... не проверили этот точный фрагмент, потому что я написал его с нуля только сейчас на SO.com, но я уверен, что принцип работает, если Я сделал какие-либо ошибки)

- (void)textWillChange:(id<UITextInput>)textInput {
    beforeStringOfTextBehindCursor = self.textDocumentProxy.documentContextBeforeInput;
    beforeStringOfTextAfterCursor = self.textDocumentProxy.documentContextAfterInput;
}

- (void)textDidChange:(id<UITextInput>)textInput {
    afterStringOfTextBehindCursor = self.textDocumentProxy.documentContextBeforeInput;
    afterStringOfTextAfterCursor = self.textDocumentProxy.documentContextAfterInput;

    BOOL didSelectionChange = NO;

    if (![beforeStringOfTextBehindCursor isEqualToString:afterStringOfTextBehindCursor]) {
        didSelectionChange = YES;
    }

    if (![beforeStringOfTextAfterCursor isEqualToString:afterStringOfTextAfterCursor]) {
        didSelectionChange = YES;
    }

    if (didSelectionChange) {
        NSLog(@"Selection Changed!");
    }   
}

Ответ 2

У меня была такая же проблема с функциями, указанными в UITextInput протоколе, который не вызывается. Причина, по которой я могу различить, связана с тем, что inputDelegate установлен во время выполнения. Согласно документам ios:

UIKit предоставляет частный делегат ввода текста, который он присваивает во время выполнения свойству inputDelegate объекта, класс которого использует протокол UITextInput. ссылка

Исправление, которое работает в моем случае, - это reset inputDelegate в функции:

textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
     replacementString:(NSString *)string

по следующей строке:

[myUITextField setInputDelegate:self];

где self реализует протокол UITextInputDelegate.