Подтвердить что ты не робот

Nil в методах делегата iOS8 - пользовательские клавиатуры

Я создаю пользовательскую клавиатуру и я реализую следующие методы делегата в моем InputViewController.
Но я всегда получаю _textInput = nil_

- (void)textWillChange:(id<UITextInput>)textInput
- (void)textDidChange:(id<UITextInput>)textInput
- (void) selectionWillChange:(id<UITextInput>)textInput
- (void) selectionDidChange:(id<UITextInput>)textInput

Кто-нибудь знает, как это исправить?
Это nil по какой-то причине?
Нужно ли мне что-то реализовать самостоятельно?

4b9b3361

Ответ 1

Хороший вопрос. Но кажется, что UITextInputDelegate не является протоколом, который вы реализуете.

Из Apple Docs под заголовком Технологии обработки текста ниже уровня:

Когда изменения происходят в текстовом представлении из-за внешних причин, т.е. они не вызваны вызовами из системы ввода текста - UITextInputобъект должен отправить textWillChange:, textDidChange:, selectionWillChange: и selectionDidChange: на вход делегат (на который он ссылается). Например, когда пользователи текстовое представление, и вы задаете диапазон выделенного текста, чтобы разместить точки ввода под пальцем, вы отправите selectionWillChange:перед изменением выбранного диапазона, и вы отправляете selectionDidChange:после изменения диапазона.

И из docs в UITextInputDelegate:

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

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

Вот пример , который иллюстрирует это:

- (void)delete:(id)sender;
{
    if (selection && ![selection isEmpty]) {
        [inputDelegate textWillChange:self];
        [inputDelegate selectionWillChange:self];
        [self replaceRange:selection withText:@""];
        [inputDelegate selectionDidChange:self];
        [inputDelegate textDidChange:self];
    }
}

Пример кода с большим количеством примеров здесь.