Как я могу перемещаться по всем моим текстовым полям с помощью кнопки «Далее» на клавиатуре iPhone?
Последнее текстовое поле должно закрыть клавиатуру.
Я настроил IB кнопки (Далее / Готово), но теперь я застрял.
Я реализовал действие textFieldShouldReturn, но теперь кнопки Next и Done закрывают клавиатуру.
ios
objective-c
iphone
PHX
источник
источник
Ответы:
В Cocoa для Mac OS X у вас есть следующая цепочка респондента, где вы можете спросить в текстовом поле, какой элемент управления должен фокусироваться дальше. Это то, что делает вкладки между текстовыми полями работать. Но поскольку устройства iOS не имеют клавиатуры, только сенсорные, эта концепция не пережила переход на Cocoa Touch.
В любом случае это легко сделать с двумя допущениями:
UITextField
находятся в одном родительском представлении.Предполагая это, вы можете переопределить textFieldShouldReturn: как это:
Добавьте еще немного кода, и предположения также могут быть проигнорированы.
Swift 4.0
Если супервизором текстового поля будет UITableViewCell, то следующим респондентом будет
источник
UITableViewCell
. Вам нужно будет получить доступ к связанномуUITableView
и получить ячейку, содержащую текстовое поле, которое вы ищете.UITextFieldDelegate
и установить текстовые поля делегатов.Существует гораздо более элегантное решение, которое поразило меня, когда я впервые увидел его. Льготы:
UITextField
иUITextView
управления - или любой клавиатурой ввода управления пользовательского интерфейсаСоздайте подкласс UITextField, который имеет
IBOutlet
свойство с именем nextField. Вот заголовок:И вот реализация:
В вашем контроллере представления вы создадите
-textFieldShouldReturn:
метод делегата:В IB измените ваши UITextFields для использования
SOTextField
класса. Затем, также в IB, установите делегат для каждого из 'SOTextFields' в 'Владелец файла' (который находится там, где вы положили код для метода делегата - textFieldShouldReturn). Прелесть этого дизайна в том, что теперь вы можете просто щелкнуть правой кнопкой мыши на любом textField и назначить выход nextField следующемуSOTextField
объекту, который вы хотите стать следующим респондентом.Более того, вы можете делать классные вещи, такие как цикл textFields, чтобы после того, как последний потерял фокус, первый снова получит фокус.
Это может быть легко расширена для автоматического назначения
returnKeyType
изSOTextField
к ,UIReturnKeyNext
если есть nextField назначен - одна вещь меньше вручную настроить.источник
UITableView
. Хотя у меня естьIBOutlet
свойства в контроллере представления для каждого текстового поля, он не позволяет мне связатьnextField
свойство с этими свойствами в владельце файла. Любой совет, как я могу заставить это работать в этом сценарии?textField1.nextField = textField2; textField2.nextField = textField3;
и т. д.Вот один без делегации:
ObjC:
Работает с использованием (в основном неизвестного)
UIControlEventEditingDidEndOnExit
UITextField
действия.Вы также можете легко подключить это в раскадровке, поэтому не требуется никакого делегирования или кода.
Изменить: на самом деле я не могу понять, как подключить это в раскадровке.
becomeFirstResponder
не кажется предложенным действием для этого контрольного события, что очень жаль. Тем не менее, вы можете подключить все ваши текстовые поля к одному действию в вашем ViewController, который затем определяет, какой textField должен бытьbecomeFirstResponder
основан на отправителе (хотя тогда это не так элегантно, как в приведенном выше программном решении, поэтому IMO делает это с помощью приведенного выше кодаviewDidLoad
).источник
[tfN addTarget:self action:@selector(loginButtonTapped:) forControlEvents:UIControlEventEditingDidEndOnExit];
. Спасибо @mxcl.Вот мое решение этой проблемы.
Чтобы решить эту проблему (и потому что я ненавижу полагаться на теги, чтобы делать что-то), я решил добавить пользовательское свойство к объекту UITextField. Другими словами, я создал категорию на UITextField следующим образом:
UITextField + Extended.h
UITextField + Extended.m
Вот как я это использую:
И реализуйте метод textFieldShouldReturn:
Теперь у меня есть своего рода связанный список UITextField, каждый из которых знает, кто следующий в очереди.
Надеюсь, это поможет.
источник
Быстрое расширение, которое применяет ответ mxcl, чтобы сделать это особенно легко (адаптировано для swift 2.3 от Traveler):
Это легко использовать:
Расширение установит кнопку возврата на «Далее» для всех, кроме последнего поля, и на «Готово» для последнего поля, а также при переключении фокуса / отклонении клавиатуры при их нажатии.
Свифт <2.3
SWIFT 3: используйте как это -
источник
UITextFieldDelegate
и реализовать егоfunc textFieldDidEndEditing(textField: UITextField)
. Просто вернись рано, еслиtextField != field3
.Более последовательный и надежный способ - использовать NextResponderTextField. Вы можете полностью сконфигурировать его из компоновщика интерфейса без необходимости устанавливать или использовать делегата
view.tag
.Все, что вам нужно сделать, это
UITextField
бытьNextResponderTextField
nextResponderField
чтобы указать следующему респонденту, что это может быть что угодноUITextField
или любойUIResponder
подкласс. Это может быть также UIButton, и библиотека достаточно умна, чтобы вызыватьTouchUpInside
событие кнопки, только если она включена.Вот библиотека в действии:
источник
Мне нравятся ОО-решения, которые уже были предложены Anth0 и Answerbot. Однако я работал над быстрым и маленьким POC, поэтому я не хотел загромождать вещи подклассами и категориями.
Другое простое решение - создать NSArray полей и искать следующее поле, когда вы нажимаете next. Не оригинальное решение, но быстрое, простое и легкое в реализации. Кроме того, вы можете увидеть и изменить порядок с первого взгляда.
Вот мой код (основанный на других ответах в этой теме):
источник
Вот реализация вкладок с использованием категории на UIControl. Это решение обладает всеми преимуществами методов от Michael и Anth0, но работает для всех UIControls, а не только для
UITextField
s. Это также работает без проблем с Интерфейсным Разработчиком и раскадровками.Источник и пример приложения: репозиторий GitHub для UIControlsWithTabbing
Применение:
Заголовок:
Реализация:
источник
Я перепробовал много кодов и, наконец, это сработало для меня в Swift 3.0 Latest [March 2017]
ViewController
Класс должен быть унаследовалUITextFieldDelegate
для создания этого кода работать.Добавьте текстовое поле с соответствующим номером тега, и этот номер тега используется для переноса элемента управления в соответствующее текстовое поле на основе присвоенного ему добавочного номера тега.
В приведенном выше коде команда
returnKeyType = UIReturnKeyType.next
where заставит клавишу «Клавиатура» вернуться к отображению, поскольку уNext
вас также есть другие параметры, например, иJoin/Go
т. Д., В зависимости от того, как ваше приложение изменяет значения.Это
textFieldShouldReturn
метод контролируемого UITextFieldDelegate, и здесь у нас есть следующий выбор поля на основе увеличения значения тегаисточник
UITextView
. Есть идеи, как это сделать в комбинации?UITextField
(введите одну строку текста), другой -UITextView
(введите несколько строк текста).UITextView
очевидно, не отвечает на этот код, но его можно использовать в формах.После выхода из одного текстового поля вы вызываете [otherTextField intoFirstResponder], и следующее поле получает фокус.
Это на самом деле может быть сложной задачей, так как часто вам также нужно прокручивать экран или иным образом регулировать положение текстового поля, чтобы его было легко увидеть при редактировании. Просто убедитесь, что много тестировались, входя и выходя из текстовых полей по-разному, а также уходя рано (всегда дайте пользователю возможность отклонить клавиатуру вместо перехода к следующему полю, обычно с помощью кнопки «Готово» в навигационная панель)
источник
источник
Очень простой способ отменить клавиатуру при нажатии кнопки «Готово»:
Создайте новый IBAction в шапке
В файле реализации (файл .m) добавьте следующий метод:
Затем, когда вы пришли, чтобы связать IBAction с текстовым полем - ссылка на событие «Закончено ли при выходе».
источник
Сначала установите клавишу возврата клавиатуры в xib, в противном случае вы можете написать код
viewdidload
:источник
Меня удивляет, как много ответов здесь не в состоянии понять одну простую концепцию: навигация по элементам управления в вашем приложении - это не то, что сами представления должны делать. Задача контроллера - решить, какой элемент управления сделать следующим первым респондентом.
Также большинство ответов относится только к навигации вперед, но пользователи также могут захотеть вернуться назад.
Итак, вот что я придумала. Ваша форма должна управляться контроллером представления, а контроллеры представления являются частью цепочки респондента. Таким образом, вы можете свободно использовать следующие методы:
Может применяться дополнительная логика для прокрутки закадровых ответчиков, видимых заранее.
Еще одним преимуществом этого подхода является то, что вам не нужно создавать подклассы всех видов элементов управления, которые вы хотите отображать (например,
UITextField
s), но вместо этого вы можете управлять логикой на уровне контроллера, где, честно говоря, это подходящее место для этого. ,источник
Я добавил к ответу PeyloW на тот случай, если вы хотите реализовать функции предыдущей / следующей кнопки:
Где вы подкласс UIView, как это:
источник
Привет всем, пожалуйста, посмотрите этот
источник
Я попытался решить эту проблему, используя более сложный подход, основанный на назначении каждой ячейке (или
UITextField
)UITableView
уникального значения тега, которое можно впоследствии извлечь: activ-next-uitextfield-in-uitableview-iosНадеюсь, это поможет!
источник
Я только что создал новый Pod при работе с этим материалом GNTextFieldsCollectionManager . Он автоматически обрабатывает следующую / последнюю проблему textField и очень прост в использовании:
Захватывает все текстовые поля, отсортированные по иерархии представления (или по тегам), или вы можете указать свой собственный массив textFields.
источник
Решение в Swift 3.1. После подключения текстовых полей IBOutlets установите делегат текстовых полей в viewDidLoad, а затем перейдите к действию в textFieldShouldReturn
источник
Если кто-то хочет так. Я думаю, что это наиболее близко к требованиям, о которых идет речь
Вот как я это реализовал
Добавьте вспомогательный вид для каждого текстового поля, для которого вы хотите настроить, используя
Используйте следующие функции для обработки нажатий
Вам нужно будет указать теги textFields в последовательности, в которой вы хотите, чтобы реагировала следующая кнопка / prev.
источник
Я предпочитаю:
В файле NIB я подключаю textFields в нужном порядке к этому массиву inputFields. После этого я делаю простой тест для индекса UITextField, который сообщает, что пользователь нажал return:
источник
источник
У меня было около 10+ UITextField в моей раскадровке, и я включил следующую функциональность, создав массив UITextField и сделав следующий UITextField firstResponder. Вот файл реализации:
источник
Это сработало для меня в Xamarin.iOS / Monotouch. Измените кнопку клавиатуры на Далее, передайте элемент управления следующему UITextField и скройте клавиатуру после последнего UITextField.
Внутри ViewDidLoad вы будете иметь:
Если у ваших TextFields нет тега, установите его сейчас:
и просто звонок
источник
Это простое решение в быстром, без использования тегов, без уловок раскадровки ...
Просто используйте это расширение:
И назовите это так (например) с вашим делегатом текстового поля:
источник
Более безопасный и прямой путь, предполагая:
Swift 4.1:
источник
в textFieldShouldReturn вы должны проверить, что текстовое поле, в котором вы находитесь в данный момент, не является последним, когда они щелкают далее, и если оно не отменяет клавиатуру.
источник
Это старый пост, но у него высокий рейтинг страниц, поэтому я поделюсь своим решением.
У меня была похожая проблема, и в итоге я создал подкласс
UIToolbar
для управления следующей / предыдущей / готовой функциональностью в динамическом табличном представлении с разделами: https://github.com/jday001/DataEntryToolbarВы устанавливаете панель инструментов как inputAccessoryView ваших текстовых полей и добавляете их в свой словарь. Это позволяет вам переключаться между ними вперед и назад, даже с динамическим контентом. Существуют методы делегирования, если вы хотите запускать свои собственные функции, когда происходит навигация по textField, но вам не приходится иметь дело с управлением какими-либо тегами или статусом первого респондента.
По ссылке на GitHub есть фрагменты кода и пример приложения, чтобы помочь с деталями реализации. Вам понадобится ваша собственная модель данных, чтобы отслеживать значения внутри полей.
источник
Без использования тегов и без добавления свойства для nextField / nextTextField вы можете попробовать это для эмуляции TAB, где «testInput» - ваше текущее активное поле:
источник
Я использую ответ Майкла Дж. Эммонса уже около года, прекрасно работает. Недавно я заметил, что вызов resignFirstResponder и затем сталFirstResponder немедленно может привести к "сбоям" клавиатуры, исчезновению и немедленному появлению. Я немного изменил его версию, чтобы пропустить resignFirstResponder, если nextField доступен.
источник