Исчезающий текст UITextField
Проблема, с которой я сталкиваюсь, заключается в том, что текст в UITextField исчезает при каждом нажатии клавиши на iOS. Эта проблема произошла в нескольких контроллерах представлений, но ранее я смог решить проблему, увеличив текстовое поле, предоставив ей больше места для рисования текста внутри.
Это решение не работает в этой конкретной ситуации. Я использую собственный шрифт для своего приложения, поэтому я использовал подкласс UITextField для текстовых полей, которые автоматически устанавливают пользовательский шрифт. Я попытался вернуться к основному UITextField, но это не решает проблему.
Я также пробовал комментировать методы делегатов, которые я реализовал в контроллере проблем, и это не решает мою проблему. Я действительно не знаю, что еще попробовать, поэтому я надеюсь, что кто-то другой может указать мне в правильном направлении. Вот что я обнаружил о своей проблеме до сих пор:
- Текст исчезает и снова появляется с каждым нажатием клавиши, хотя нажатие кнопки возврата не изменяет внешний вид/исчезновение текста (т.е. при нажатии на обратное пространство при видимом тексте текст обычно удаляется. Если нажатие в то время, когда текст скрытые, символы удаляются из текстового поля, но пользователь не видит, что происходит).
- Текст появляется внизу текстового поля, когда он виден, а текстовое поле является первым ответчиком
- Когда другое текстовое поле становится первым ответчиком, текст в проблемном текстовом поле будет правильно нарисован, центрирован по вертикали в текстовом поле и всегда будет виден.
- Создание текстового поля первого ответчика, когда он имеет текст в нем, уже приведет к перерисовке текста и появлению, как если бы он прокручивался вверх/вниз в текстовом поле. Текст будет поочерёдно центрироваться в текстовом поле и "прокручиваться" вниз, или быть выведенным из вида, и "прокручивать" вверх по представлению, опираясь на нижнюю часть текстового поля.
- Контроллер вида имеет проблемы только в одном из двух режимов, в котором он представлен. Он либо представлен как контроллер корневого представления UINavigationController, либо он помещается в текстовый стек UINavigationController, представленный в модальном режиме, в качестве третьего контроллера навигации просмотрите контроллер. В первом случае, когда он является контроллером корневого представления, текстовые поля работают отлично и не проявляют ничего странного поведения, описанного выше. Странное поведение происходит во втором случае.
Хороший пример этой проблемы можно увидеть в видео, опубликованном в этом аналогичном вопросе: Текст UITextField исчезает при каждом нажатии клавиши. Ответы на сам вопрос не полезны и не решают моих проблем.
ИЗМЕНИТЬ
Мне удалось воспроизвести проблему, с которой я столкнулся раньше. Оказывается, проблема была вызвана добавлением подсмотра в представление контроллера навигации, а затем его удаление, когда UITextField был в фокусе. Если субвью удаляется, пока UITextField не редактируется, ошибка не будет возникать.
В моем случае загрузочное изображение было добавлено в качестве подсмотра навигационному контроллеру во время сетевого вызова и удалено после завершения указанного вызова. За это время будет активирован UITextField, что приведет к тому, что выше будет описан визуальный баг.
Я воссоздал ошибку в автономном примере проекта, который я загрузил здесь: https://www.dropbox.com/s/s4kc05vg1pwteeo/Funky%20TextField%20Tester.zip. Также обратите внимание, что если вы сообщите textField, чтобы он стал первым ответчиком в реализации viewDidLoad для контроллера вида, эта ошибка будет происходить прямо в начале и сохраняется.
НОВЫЙ ВОПРОС
Мне легко просто избегать размещения представления загрузки в представлении диспетчера навигации, но это дает мне хороший эффект, когда загрузочное представление "плавает" в одной и той же позиции на экране, тогда как его вводят в view view контроллера на стеке nav поднимает кучу визуальных проблем (перемещение позиции просмотра загрузки, когда контроллер представления помещается в стек, загрузочный вид затенен другими контроллерами представлений и т.д.).
Есть ли способ воспроизвести такой вид, не помещая представление в представление контроллера навигации или, возможно, безопасный способ поместить его в представление контроллера навигации, не выполняя странные обходные пути, такие как остановка редактирования на всех UITextFields в течение времени представление подзаголовка?
Ответы
Ответ 1
У меня такая же проблема, как и в предыдущей версии.
благодаря вашему проекту, который я тестировал, я обнаружил, что проблема связана с представлением контроллера вида, встроенного в контроллер навигации, с полупрозрачной навигационной панелью.
Я установил непрозрачную полосу в моделируемых показателях навигационного контроллера, который я представлял, и больше не проблема с UITextField.
В моем случае, по крайней мере, все было разрешено в тот момент, когда я установил непрозрачный бар для верхнего бара в моделируемых показателях в InterfaceBuilder для моего UINavigationController, который встраивает UIViewController, который я хотел бы представить modally
Надеюсь, он будет таким же и для вас.
Ответ 2
У меня была аналогичная проблема, когда UITextField показывал текст в порядке, но когда я вернулся с фона, он не показывал текст, и текстовое поле, казалось, не отвечало. Тем не менее, я заметил, что он фактически принял ввод. Это просто не видно. Отображение представления в режиме дефрагментации xcode показало, что текстовое поле было перемещено вниз и было наложено под другими видами и не было видно. В моем случае я отключил AutomaticallyAdjustScrollViewInsets до NO, и проблема была излечена!
Ответ 3
У меня эта точно такая же проблема в двух барах поиска и нескольких UITextFields в моем приложении. Похоже, он приходит и идет необъяснимо и происходит по нескольким типам устройств в симуляторе и на нескольких реальных устройствах. Перезагрузка фактического телефона, похоже, заставляет проблему уйти в приложении, которое было установлено на телефоне. Я предполагаю, что это ошибка Apple... но у меня действительно нет никаких причин, и ни одно из решений здесь, похоже, не устраняет проблему.
![Here's what it looks like when you're typing in the text field inside the search bar.]()
UPDATE
Хорошо, я, возможно, решил это... У меня есть контроллер входа в систему, который отображается перед этим текстовым полем, и я обнаружил, что если я открою клавиатуру на этом контроллере входа (например, введите имя пользователя и пароль), тогда это происходит. Но если я не открываю клавиатуру, тогда это совершенно нормально.
ОБНОВЛЕНИЕ 2 - РЕШЕНО!!
Итак, оказалось, что когда текстовое поле пользователя или пароля в контроллере входа в систему было выбрано, один из них стал первым ответчиком. Когда пользователь ударил Login и вид ушел, эти поля никогда не уходили от первого ответчика, поэтому он помещал клавиатуру в состояние потока для остальной части приложения.
После ввода текстовых полей в качестве первого ответчика, как показано ниже, в моем методе входа в систему была решена проблема:
if (_emailTextField.isFirstResponder) {
[_emailTextField resignFirstResponder];
}
if (_passwordTextField.isFirstResponder) {
[_passwordTextField resignFirstResponder];
}
...do login stuff
Ответ 4
У меня была такая же проблема. Я использовал метод getFirstResponder внутри viewDidLoad. Но потом я почувствовал, что makeFirstResponder должен находиться внутри ViewDidAppear, потому что метод didLoad отображает весь вид, тогда нет взаимодействия с пользователем. фактическое взаимодействие с пользователем начинается после viewDidAppear, поэтому я переместил startFirstResponder внутри метода viewDidAppear, и теперь все работает нормально.
Предыдущая
-(void)viewDidLoad{
[self viewDidLoad];
[self.textField becomeFirstResponder];
......
}
После
-(void)viewDidAppear:(BOOL)animated{
[self.loginTextField becomeFirstResponder];
......
}
Ответ 5
Кажется, это довольно распространенная ошибка от Apple, и люди решили ее разными способами.
Я столкнулся с той же проблемой. После некоторых испытаний я нашел свое дело в том, что я скрываю панель навигации, когда определенный textField "сделалBeginEditing". Как только эта ошибка возникает, она встречается вокруг приложения не только в этом контроллере.
Я устранил эту ошибку, не скрывая навигационную панель (это не то, что я действительно хотел, но не имел выбора).
Надеюсь, это поможет кому-то. Вкратце, эта ошибка может произойти по разным причинам. Попытайтесь отменить некоторые изменения, пока ошибка не исчезнет, тогда вы знаете, откуда именно она исходит.
Ответ 6
У меня была аналогичная проблема на некоторых UITextFields, добавленных в UIView, и обнаружил, что это была ошибка, созданная мной не яблоком. Я устанавливаю textfield.setContentScaleFactor в textFieldDidBeginEditing делегат.
[textField setContentScaleFactor: 10.0];
Удаление вышеуказанной строки, и она работает без каких-либо других действий.
Иерархия My View --- > UIScrollview → UIImageView → UIView → UITextField
Надеюсь, это поможет кому угодно.
Ответ 7
У меня была аналогичная проблема. Выбрал его, отменив клавиатуру для предыдущего экрана.
На предыдущем экране появилось текстовое поле с типом клавиатуры Numpad
. Поэтому, прежде чем подойти к экрану, где мерцает текстовое поле, я назвал resignFirstResponder
.
Ответ 8
EDIT с оригинального вопроса Ziewvater решил мою проблему. У меня было несколько текстовых полей, загружаемых во время выполнения, и всякий раз, когда я возвращался назад, эти представления удалялись/удалялись, а затем каждый раз создавали новые текстовые поля. После перезагрузки один раз, это был бы чистый текст, но после завершения редактирования свойство textfield.text было бы установлено, и вы могли бы видеть текст.
var responder = View.FindFirstResponder(); //(i'm in Xamarin)
if(responder != null)
responder.ResignFirstResponder();
Выполнение этого в представлении будет устранено. СПАСИБО!!!!!!!