CustomTextField — автозаполнение/автозамена не будет закрываться при касании

Поэтому я создал собственное текстовое представление, используя базовую графику, и согласовал его с протоколами UITextInput и UITextInputTraits. Все работает нормально, за исключением одного странного/раздражающего поведения. Клавиатура корректно отображает предложения автокоррекции, но когда пользователь нажимает на предложение, помеченное знаком «X», предложение не отклоняется, а вставляется. Я проверил, и во всех других программах нажатие на предложение со знаком «X» отклоняет предложение. Как это исправить?

В моем пользовательском текстовом представлении у меня есть следующие iVars:

//UITextInputTraits
UITextAutocapitalizationType _uiAutoCap;
UITextAutocorrectionType _uiAutoCorrect;
UITextSpellCheckingType _uiSpellCheck;
UIKeyboardType _uiKeyboard;
UIKeyboardAppearance _uiKeyboardAppearance;
UIReturnKeyType _uiReturnType;
BOOL _uiEnableAutoReturn;
BOOL _uiSecureText;

Которые синтезируются с соответствующими свойствами TextInputTraits:

@synthesize autocapitalizationType=_uiAutoCap, autocorrectionType=_uiAutoCorrect, spellCheckingType=_uiSpellCheck, keyboardType=_uiKeyboard, keyboardAppearance=_uiKeyboardAppearance, returnKeyType=_uiReturnType, inputDelegate=_uiTextDelegate, enablesReturnKeyAutomatically=_uiEnableAutoReturn, secureTextEntry=_uiSecureText;

И они инициализируются следующими значениями по умолчанию:

    _uiAutoCorrect = UITextAutocorrectionTypeDefault;
    _uiSpellCheck = UITextSpellCheckingTypeDefault;
    _uiKeyboardAppearance = UIKeyboardAppearanceDefault;
    _uiAutoCap = UITextAutocapitalizationTypeNone;
    _uiReturnType = UIReturnKeyDefault;
    _uiEnableAutoReturn = NO;
    _uiSecureText = NO;
    _uiKeyboard = UIKeyboardTypeDefault;

Есть идеи?


person Aaron Hayman    schedule 06.06.2012    source источник
comment
Были ли у вас трудности с отображением автозаполнения? У меня есть рабочий текстовый редактор, но я не могу заставить автозаполнение отображаться вообще.   -  person BarrettJ    schedule 10.10.2012
comment
Навскидку я могу придумать несколько причин, по которым он может не появиться. 1) Вы предоставляете неверный CGRect для firstRectForRange. 2) Один из многих методов, вычисляющих положение или смещение, неверен. 3) Вы возвращаете значение для markedTextRange, когда его не должно быть. Отладка UITextInput может быть большой проблемой. Я нашел полезным NSLog все методы протокола вместе с их входными и возвращаемыми значениями, чтобы найти ошибку. Вы можете найти это полезным: NSLog(@"%s", __PRETTY_FUNCTION__);. Это регистрирует класс/метод, в который он помещен. Вам придется регистрировать значения вручную.   -  person Aaron Hayman    schedule 10.10.2012
comment
Симулятор может не предлагать автокоррекцию, когда вы печатаете на физической клавиатуре компьютера. Попробуйте нажать кнопки клавиатуры на экране симулятора.   -  person Walt Sellers    schedule 08.12.2012


Ответы (1)


Изменить: Возможный ответ

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

- (NSDictionary *)textStylingAtPosition:(UITextPosition *)position inDirection:(UITextStorageDirection)direction;

когда он хочет сделать предложение, поэтому у вас может быть ivar (BOOL), который хранит, есть ли предложение (сделайте его значение NO всякий раз, когда вызывается метод UIKeyInput, и YES, когда вызывается метод textStyling). Затем измените свой распознаватель жестов, чтобы он не менял выбор, если вышеупомянутый ivar имеет значение YES, а нажатие находится в прямоугольнике окна предложения (вы можете получить этот прямоугольник, удвоив высоту прямоугольника, возвращаемого из - (CGRect) firstRectForRange:(UITextRange *)диапазон;). Надеюсь, это сработает.

Изменить: вы должны просто реализовать метод UIGestureRecognizerDelegate:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

Так что он получает касание только в том случае, если touch.view == (yourTextView)

У меня такая же проблема, и пока нет решения; однако я считаю, что вы должны соответствовать UITextInputTraits, создавая функции, которые возвращают значение, которое вы хотели бы получить для свойства. Пример: чтобы трейт UITextAutoCorrectionType имел значение UITextAutocorrectionTypeDefault, вы должны предоставить метод доступа:

- (UITextAutocorrectionType)autocorrectionType {
    return UITextAutocorrectionTypeDefault;
}
person Mat K Hall    schedule 15.06.2012
comment
Я соответствую UITextInputTraits. Я подтвердил, что свойства правильно синтезируются путем изменения соответствующих значений инициализации (таких как внешний вид клавиатуры и включение/выключение автокоррекции) и наблюдения за правильными изменениями во внешнем виде/поведении клавиатуры. Так что, насколько я могу судить, все настроено правильно. - person Aaron Hayman; 15.06.2012
comment
Вы правы в том, что мое представление все еще получало событие касания и изменяло выбранный диапазон, что побуждало автокоррекцию отправлять вместо отмены. Однако все, что мне нужно было сделать, это реализовать - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ return (touch.view == self); }. Автокоррекция теперь отменяется как надо. Спасибо! - person Aaron Hayman; 06.08.2012