При программном задании UITextField как FirstResponder возникают странные действия при редактировании текста.

У меня есть UITextField с пользовательской клавиатурой, в основном как калькулятор. Я хотел бы, чтобы моя клавиатура отображалась по умолчанию, поэтому я использовал [self.topInputTextField becomeFirstResponder]; в viewDidLoad, я думаю, что это очень распространенное использование. Однако это вызывает очень странные действия в моем текстовом поле.

Когда я устанавливаю свое текстовое поле в качестве первого ответчика в viewDidLoad, и каждый раз после редактирования текст будет прыгать, и когда я щелкаю другое текстовое поле и снова щелкаю первое текстовое поле, тексты в первом текстовом поле иногда сдвигаются вниз и исчезают, но иногда нет. Я чувствую, что это очень сложно описать, поэтому я записал для него изображение в формате GIF.

введите здесь описание изображения

И причина, по которой я уверен, что [self.topInputTextField becomeFirstResponder]; вызывает проблему, заключается в том, что когда я прокомментирую эту строку кода, все возвращается к норме. вот GIF после того, как я закомментировал эту строку:

введите здесь описание изображения

это очень странно для меня, между двумя файлами GIF единственное изменение, которое я сделал, это закомментировать эту строку кода. Я не мог найти никакого решения на SE. Любая идея будет очень признательна.

Редактировать: Еще одна вещь: я пытался изменить шрифт и размер шрифта, все они имеют одинаковое странное поведение.

* Редактировать 2: ** вот как я настроил свое текстовое поле, я не делал ничего необычного

введите здесь описание изображения


person Xu Yin    schedule 20.02.2014    source источник
comment
не могли бы вы включить дополнительную информацию о размере текстовых полей? и как они настроены в контроллере представления или файле пера?   -  person PaulWoodIII    schedule 20.02.2014
comment
лучше, если вы предоставите часть своего кода для того же.   -  person hpp    schedule 20.02.2014
comment
обязательно добавлю еще скрин   -  person Xu Yin    schedule 20.02.2014


Ответы (2)


Попробуйте вызвать клавиатуру в viewDidAppear, этот метод вызывается после viewDidLoad. Я предполагаю, что это потому, что вы должны вызывать клавиатуру только для загруженного представления, которое появилось у пользователя, поэтому, если вы вызовете его до того, как представление действительно появится, это вызовет неожиданное поведение.

person David P    schedule 20.02.2014
comment
Представление, вероятно, не может стать ответчиком до того, как оно станет видимым, потому что оно еще не является частью цепочки ответчика. - person Jef; 20.02.2014
comment
Благослови свою Душу за этот ответ, таинственный Куриный Человек. - person user1011713; 14.04.2014

viewDidLoad слишком рано для вызова этого, пользовательский интерфейс не определил размер вашего экрана или даже ориентацию вашего устройства. На самом деле это еще не пользовательский интерфейс... Попробуйте это в willAppearAnimated: ..

person Jef    schedule 20.02.2014
comment
Вы пробовали и viewWillAppear, и viewDidAppear? - person David P; 20.02.2014
comment
@Chicken на самом деле только что попробовал viewDidAppear, он решил эту проблему .. viewWillAppear не будет .. можете ли вы добавить это в качестве ответа, и не могли бы вы немного объяснить? - person Xu Yin; 20.02.2014
comment
Рассуждения Джефа были правильными, фактический рисунок пользовательского интерфейса не был завершен в viewDidLoad. Спасибо :) - person David P; 20.02.2014
comment
Ну, это самые дешевые 15 очков, которые ты когда-либо выиграешь на стеке, пират :p браво - person Jef; 20.02.2014
comment
@chicken, никаких обид, шутка, приятель - person Jef; 20.02.2014