Как убрать клавиатуру swift

Обновлено: 07.07.2024

Я использую UITextfied при нажатии на текстовую клавиатуру, но когда я нажимаю клавишу return , клавиатура не исчезает. Я использовал следующий код:

метод resignfirstresponder не входит в функцию.

если какой-либо ответ соответствует вашему требованию, отметьте его как ответ, чтобы другие люди могли получить от него помощь.

Вы можете заставить приложение отклонить клавиатуру, используя следующую функцию

Вот полный пример, чтобы лучше проиллюстрировать это:

Мне не хватало "self.myTextField.delegate = self;" Спасибо! @RSC вы можете мне объяснить строку self.myTextField.delegate = self . это работает, но я не знаю, что здесь происходит (пробовал гуглить, но безуспешно) @kommradHomer, без сомнения, есть что-то еще, что заставляет вашу клавиатуру не показывать. Если вы хотите, поместите свой код на pastebin и вставьте ссылку здесь, чтобы я его увидел. @RSC вы, скорее всего, были правы. Я новичок на IOS 2 дня, так что как-то избавился от моей проблемы, и все заработало, как вы и предлагали :) в чем разница между верным или ложным? Я пробовал оба, и оба работают одинаково? Так что работай для меня (swift 3): func textFieldShouldReturn(textField: UITextField) -> Bool < перейти на func textFieldShouldReturn(_ textField: UITextField) -> Bool < Почему я должен изменить тип FirstViewController на UIViewController, UITextFieldDelegate? Я понимаю, что без этого я получу ошибку. Но почему это? Когда вы добавляете «, UITextFieldDelegate», вы в основном говорите, что ваш ViewController будет соответствовать протоколам UITextFieldDelegate и, следовательно, может рассматриваться как делегат для функций TextField (в данном случае, для функции «textFieldShouldReturn»).

return true часть этого только говорит текстовому полю, разрешено ли ему возвращаться.
Вы должны вручную указать текстовое поле, чтобы закрыть клавиатуру (или каков ее первый респондент), и это делается с помощью resignFirstResponder() , например так:

спасибо . в моем случае метод resignFirstResponder () не получал автоматически, и я подумал, что он не поддерживает, но при написании вручную работает нормально . спасибо, что я ищу. @AshwinMangrulkar вы можете ожидать, что в бета-версии Xcode 6 функция автоматического завершения может быть отключена. @ 0x7fffffff Не могли бы вы объяснить, что означает «resignFirstResponder»? Я прочитал документацию для UIresponder, и я не до конца понимаю, что это такое. Кажется, что это нечеткий метод, используемый для «потери фокуса на конкретном элементе пользовательского интерфейса», который реализован в UITextField. и, конечно, точка с запятой после «истина» больше не требуется Разве это не требование, что ваш viewController соответствует UITextFieldDelegate ? вместо self.view.endEditing () этот ответ уместен и правильный подход

Добавьте UITextFieldDelegate в объявление класса:

Подключите textfield или напишите его программно

установите ваш контроллер представления, поскольку делегат текстовых полей в поле зрения загрузил:

Добавьте следующую функцию

со всем этим ваша клавиатура начнет отклоняться, коснувшись внешнего поля, а также нажав клавишу возврата.

Спасибо чувак! Мне не хватало этого: UITextFieldDelegate . большое спасибо! По какой-то причине, когда я устанавливаю txtField.delegate = self, я не могу печатать в этом текстовом поле после запуска приложения. @JesusAdolfoRodriguez должна быть причина этой ошибки, хотя этот код не вызывает никаких проблем. : D Удачного кодирования! Спасибо за шаг за шагом. Это было более полезным для меня, чем просто блок кода. «При всем этом ваша клавиатура начнет отклоняться, касаясь за пределами текстового поля» - неправда. textFieldShouldReturn вызывается только по нажатию кнопки возврата.

Простое быстрое решение 3: Добавьте эту функцию в контроллеры просмотра, которые имеют текстовое поле:

Затем откройте свой помощник и убедитесь, что ваша Main.storyboard находится на одной стороне вашего вида, а требуемый файл view controller.swift - на другом. Нажмите на текстовое поле, а затем выберите в правой панели утилиты "Показать инспектор подключений". Управляйте перетаскиванием из "Сделанный конец при выходе" в указанную выше функцию в вашем быстром файле. Повторите для любого другого текстового поля в этой сцене и ссылайтесь на ту же функцию.

для меня критическое дополнение в Xcode версии 6.2 (6C86e) находится в override func viewDidLoad()

Попробовал заставить его работать с ключом возврата в течение нескольких часов, пока я не нашел ваш пост, RSC. Спасибо!

Кроме того, если вы хотите скрыть клавиатуру, если вы касаетесь в любом месте экрана:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)

Чтобы получить автоматическое отключение клавиатуры, я помещаю этот код в один из методов моего класса текстового поля:

Замените название своей розетки на textField .

Отлично. Это самый короткий и лучший вариант на мой взгляд. Особенно, когда вы создаете текстовое поле внутри другого метода. Как внутри заголовка табличного представления.

Другой способ сделать это, который в основном использует раскадровку и легко позволяет вам иметь несколько текстовых полей:

Подключите все текстовые поля для этого контроллера представления к этому действию в событии Did End On Exit каждого поля.

В данной статье разберем, как скрывать клавиатуру по нажатию на вьюху от самых основ до реализации в одну строчку или совсем без кода.


Основы

Достаточно часто встречается следующий кейс: по нажатию на задний фон скрывать клавиатуру.

Базовое решение — имеем ссылку на UITextField , создаем UITapGestureRecognizer с методом, который снимает выделение с текстового поля и выглядит оно так:

В данной статье используется Swift 3, но можно реализовать и на других версиях и на Objective-C

Проблемы данного кода:

  • viewDidLoad грязный и нечитабельный
  • много кода в контроллере
  • не переиспользуемый

Делаем читабельным

Для решения первой проблемы мы можем вынести код создания и добавления жеста в отдельную функцию:

Кода стало еще больше, но он стал чище, логичней и приятней глазу.

Уменьшение кода

Для решения второй проблемы у UIView есть метод:

Он как раз отвечает за снятие выделения с самой вьюхи или ее subview. Благодаря ему мы можем сильно упростить наш код:

Если делаете по шагам, то не забудьте удалить textField свойство из IB.
Также поменяйте target с self на view .

Код стал радовать глаз! Но копировать это в каждый контроллер все еще придется.

Решение копирования

Для переиспользуемости вынесем наш метод добавления в extension контроллера:

И код нашего контроллера будет выглядеть следующим образом:

Чисто, одна строчка кода, и она переиспользуема! Идеально!

Несколько вьюх

Решение выше — очень хорошее, но в нем кроется один минус: мы не можем добавить жест на конкретную вьюху.

Для решения данного кейса воспользуемся расширением UIView :

и соответственно код контроллера будет выглядеть так:

Тут возникает другая проблема: данное расширение решает проблему только для вьюхи контроллера. Если мы добавить someView на view и на нее повесим жест, то не сработает. Это все из-за того, что метод endEditing работает только для вьюхи, которая содержит активную вьюху или сама таковой является, а нашего текстового поля скорее всего не будет в нем. Решим данную проблему.

Т.к. view контроллера точно будет содержать активную вьюху, и наша добавленная вьюха всегда будет в ее иерархии, то мы можем дотянуться до view контроллера через superview и у нее вызвать endEditing .

Получаем view контроллера через расширение UIView:

Скажу сразу, изменив селектор на:

работать все еще не будет. Нам необходимо добавить метод, который будет вызывать конструкцию выше:

Вот теперь заменяем селектор на:

Итак, расширение для UIView будет выглядеть следующим образом:

Теперь, используя addTapGestureToHideKeyboard() для любой вьюхи мы будем скрывать клавиатуру.

KeyboardHideManager

Решением выше я пользовался долгое время, но потом стал замечать, что даже одна строка загрязняет функцию установки вьюх. Так же, (редко, но все же бывает) не очень красиво выглядит, когда это единственный метод во viewDidLoad :

Вместе с пробелом это занимает 5 строк, что сильно сказывается на чистоте контроллера! У меня появилась идея сделать все это без кода, чтобы не было в контроллере и одной лишней строчки. Я создал класс, который можно добавить в IB с помощью Object

object

И с помощью @IBOutlet привязать нужные нам вьюхи:

preview

Реализация данного класса наипростейшая — добавляем жест на каждую вьюху с помощью выше созданных функций:

Чтобы воспользоваться данным классом, нужно три простых действия:

usage_1

  • 2) Установить KeyboardHideManager в качестве класса данного объекта

usage_2

  • 3) Соединить нужные вьюхи со свойством targets

usage_3

Да, больше действий, чем написать одну строку (или несколько строк, если несколько определенных вьюх), за то этой самой строки нету в контроллере.

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

Данный класс можете подключить через CocoaPods или просто скопировать в проект.

Ссылка на исходный код KeyboardHideManager с полным ReadMe о самой библиотеке и ее подключении.

Разобрали реализацию популярного кейса, рассмотрели несколько его решений, в одну строку и без кода вообще. Используйте тот способ, который больше нравится.

Я искал все это, но я не могу найти его. Я знаю, как убрать клавиатуру с помощью Objective-C , но я понятия не имею, как это сделать с помощью Swift ? Кто-нибудь знает?

ОТВЕТЫ

Ответ 1

Вот еще один способ выполнить эту задачу, если вы собираетесь использовать эту функцию в нескольких UIViewControllers :

Теперь в каждом UIViewController все, что вам нужно сделать, это вызвать эту функцию:

Ответ 2

Ответ на ваш вопрос о том, как убрать клавиатуру в Xcode 6.1 с помощью Swift ниже:

Ответ 3

Вы можете позвонить

в любом экземпляре идентификатора UIR, например UITextField. Если вы вызываете его в представлении, которое в настоящее время вызывает отображение клавиатуры, клавиатура будет упущена.

Ответ 4

Swift 4 работает

Создайте расширение, как hideKeyboardWhenTappedAround() ниже, и вызовите hideKeyboardWhenTappedAround() в вашем контроллере базового представления.

Ответ 5

Ответ 6

для Swift 3 очень просто

если вы хотите скрыть клавиатуру при нажатии клавиши RETURN

но во втором случае вам также потребуется передать делегат из всех текстовых полей в ViewController в Main.Storyboard

Ответ 7

Swift 3: Самый простой способ убрать клавиатуру:

Ответ 8

Ответ на тире правильный и предпочтительный. Более подход "выжженной земли" - это вызов view.endEditing(true) . Это приводит к тому, что view и все его подпрограммы resignFirstResponder . Если у вас нет ссылки на представление, которое вы хотите уволить, это хакерское, но эффективное решение.

Обратите внимание, что лично я думаю, что вы должны иметь ссылку на представление, которое вы хотели бы оставить первым ответчиком. .endEditing(force: Bool) - варварский подход; пожалуйста, не используйте его.

Ответ 9

! [как отключить клавиатуру..] [1]

Ответ 10

  • выберите TableView
  • с правой стороны, выберите инспектор атрибутов
  • в разделе клавиатуры - выберите нужный режим увольнения

Ответ 11

Swift 3:

Расширение с Selector как параметр, чтобы иметь возможность делать дополнительные вещи в функции увольнения и cancelsTouchesInView , чтобы предотвратить искажение с касаниями других элементов представления.

Ответ 12

Если вы используете представление прокрутки, это может быть намного проще.


Просто выберите Dismiss interactively в раскадровке.

Ответ 13

В Swift 4 добавьте @objc:

Ответ 14

Я нашел, что лучшее решение включало принятый ответ от @Esqarrouth с некоторыми настройками:

Строка tap.cancelsTouchesInView = false была критической: она гарантирует, что UITapGestureRecognizer не мешает другим элементам представления получать пользовательское взаимодействие.

Метод dismissKeyboard() был изменен на несколько менее элегантный dismissKeyboardView() . Это связано с тем, что в моем проекте довольно старая база кода было много раз, когда dismissKeyboard() уже использовался (я думаю, это не редкость), вызывая проблемы с компилятором.

Затем, как и выше, это поведение можно включить в отдельных контроллерах просмотра:

Ответ 15

Ответ 16

Я всегда использую следующее, чтобы отклонить клавиатуру, особенно если класс, из которого я отклоняю клавиатуру , не имеет свойства view и/или не является подклассом UIView .

И, для удобства, следующее расширение класса UIApplcation :

Ответ 17

Как начинающий программист, он может сбивать с толку, когда люди производят более квалифицированные и ненужные ответы. Вам не нужно делать какие-либо сложные вещи, показанные выше.

Вот простейшая опция. В случае, когда ваша клавиатура появляется в ответ на текстовое поле - внутри вашей функции сенсорного экрана просто добавьте функцию resignFirstResponder. Как показано ниже - клавиатура закрывается, поскольку первый ответчик освобождается (выходит из цепи ответчика).

Ответ 18

Этот один лайнер подает в отставку Клавиатуру из всех (любых) UITextField в UIView

Ответ 19

В Swift вы можете использовать

Ответ 20

Добавьте это расширение к вашему ViewController:

Ответ 21

Я использую IQKeyBoardManagerSwift для клавиатуры. Это простой в использовании. просто добавьте модуль 'IQKeyboardManagerSwift'

Импортируйте IQKeyboardManagerSwift и пишите код в didFinishLaunchingWithOptions в AppDelegate .

Ответ 22

swift 5 достаточно двух строк Добавить в ваш viewDidLoad должно работать.

Если ваш жест касания заблокировал некоторые другие касания, добавьте эту строку:

Ответ 23

Для Swift3

Зарегистрировать распознаватель событий в представленииDidLoad

тогда нам нужно добавить жест в представление в том же viewDidLoad.

Ответ 24

Другая возможность - просто добавить большую кнопку без содержимого, которое находится под всеми видами, которые вам могут потребоваться. Дайте ему действие с именем:

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

Ответ 25

Если у вас есть другие представления, которые также должны получить прикосновение, вам нужно установить cancelsTouchesInView = false

Ответ 26

Попробуйте это, It Working

Ответ 27

Вы также можете добавить распознаватель жестов кран, чтобы отменить клавиатуру.: D

Ответ 28

Чтобы следовать рекомендациям @modocache, чтобы избежать вызова view.endEditing() , вы можете отслеживать текстовое поле, которое стало первым ответчиком, но это беспорядочно и подвержено ошибкам,

Альтернативой является вызов resignFirstResponder() во всех текстовых полях в диспетчере просмотра. Вот пример создания коллекции всех текстовых полей (что в моем случае было необходимо для проверки кода):

Если доступная коллекция доступна, попробуйте выполнить итерацию через все из них:

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

Комментарии приветствуются. Если есть проблема с вызовом resignFirstResponder() на элементах управления, которые не являются первыми ответчиками, или если есть простой и гарантированный не-глючный способ отслеживать текущего первого ответчика, я хотел бы услышать об этом!

Я использую UITextfied при нажатии на текстовую клавиатуру появляются, но когда я нажал return клавиша, клавиатура не пропадает. Я использовал следующий код:

метод resignfirstresponder не входит в функцию.

Вы можете заставить приложение отклонить клавиатуру, используя следующую функцию

Вот полный пример, чтобы лучше проиллюстрировать это:

Часть return true сообщает только текстовому полю, разрешено ли возвращение.
Вы должны вручную указать текстовое поле, чтобы убрать клавиатуру (или каков ее первый респондент), и это делается с помощью resignFirstResponder() , например так:

Добавьте UITextFieldDelegate к объявлению класса:

Подключите textfield или напишите его программно

установите ваш контроллер представления так, как загружал делегат текстовых полей в представлении:

Добавьте следующую функцию

при этом ваша клавиатура начнет отключаться, касаясь за пределами текстового поля так же, как и нажатием клавиши возврата.

Простое Swift 3 Решение: добавьте эту функцию в контроллеры представления с текстовым полем:

Затем откройте ваш помощник редактора и убедитесь, что ваш Main.storyboard находится на одной стороне вашего представления, а нужный контроллер представления. Файл Swift находится на другой. Щелкните текстовое поле, а затем выберите на правой панели служебных программ "Показать вкладку Инспектор подключений". Управляйте перетаскиванием из функции "Закончено ли при выходе" в указанную выше функцию в файле Swift Повторите эти действия для любого другого текстового поля в этой сцене и укажите ссылку на ту же функцию.

для меня критическое дополнение в Версии 6.2 Xcode (6C86e) находится в override func viewDidLoad()

Пытался заставить его работать с ключом возврата в течение нескольких часов, пока я не нашел ваш пост, RSC. Спасибо!

Кроме того, если вы хотите скрыть клавиатуру, если вы касаетесь где-либо еще на экране:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)

Чтобы получить автоматическое отклонение клавиатуры, я поместил этот код в один из методов класса моего пользовательского текстового поля:

Замените название вашей торговой точки на textField .

Swift 4.2 - делегат не требуется

Другой способ сделать это, который в основном использует раскадровку и легко позволяет вам иметь несколько текстовых полей:

Соедините все свои текстовые поля для этого контроллера представления с этим действием в событии Did End On Exit каждого поля.

У меня мало опыта в Objective-C. Я хочу, чтобы скрыть клавиатуру для текстового поля, используя язык программирования Swift.

Я также пробовал это

но метод не запускается, когда я нажимаю return. Кому-нибудь повезло с этим?

Я думаю, что проблема заключается в настройке делегата.

пожалуйста, установите делегат textfield для вашего ViewController следующим образом

а затем создайте IBOutlet для вашего текстового поля, как это

убедитесь, что он подключен к текстовому полю в вашем представлении в раскадровке.

наконец, установите свой делегат с помощью

мы почти закончили. Теперь поместите эту функцию делегата в свой класс.

надеюсь, что это решит вашу проблему.

просто переопределите метод UIViewController под названием "touchesBegan" и установите endEditing в true. Вот так:

чтобы скрыть клавиатуру при нажатии кнопки, необходимо использовать следующую функцию.

это работает при нажатии кнопки.

надеюсь, это поможет кому-то там.

  1. добавьте текстовое поле в свой вид
  2. создайте новый файл Swift
  3. установите этот новый файл в качестве класса для этого конкретного представления
  4. добавьте текстовое поле в свой вид
  5. создайте выход для текстового поля (my называется "txtField"!)

замените любой код в файле класса Swift следующим:

  1. попробуйте, будьте счастливы и говорят спасибо !

добавить UITextFieldDelegate в объявление класса:

класс ViewController: UIViewController, UITextFieldDelegate

подключите текстовое поле или напишите его программно

@IBOutlet слабый var userText: UITextField!

установите контроллер представления в качестве делегата текстовых полей в представлении:

добавить следующие функция

со всем этим ваша клавиатура начнет отклонять, коснувшись вне текстового поля, а также нажав клавишу возврата.

Как сказал @spfursich, лучший способ заключается в том, что при касании пользователя в любом месте над клавиатурой клавиатура исчезнет. Вот код :

простым способом скрыть клавиатуру просто переопределите UIView "touchBegan method". Поэтому, когда вы нажимаете любое место в клавиатуре просмотра, скрыть. вот пример кода.. (Swift 3.0 обновленный код)

сначала вам нужно установить delegate для вашего текстового поля вам нужно включить resignFirstResponder() чтобы скрыть клавиатуру при нажатии кнопки возврата keybaord.

вы можете попробовать этот код, чтобы ключ "return"выполнял код.

надеюсь, это поможет вам.

вы также можете сделать такой: добавить событие "Did end on exit" из инспектора соединений вашего текстового поля и подключите его к методу из соответствующего ViewController

в моем примере я подключаю его к методу под названием "ended"

объявить отправителя как UITextField, а затем вызвать отправителя.resignFirstResponder(); Вот так:

вот я решил проблему, что когда клавиатура открывается, и вид скрывается за клавиатурой. это время мы должны изменить ограничения UI динамически для того чтобы сделать весь вид. В моем случае я меняю bottonConstraint UITextField динамически.

Итак, вот полный код. У меня есть один UITextView и UITextField on UIViewController работать на протяжении всего испытания.

теперь в Swift 3 самые простые методы -

Способ 1: вызывается при нажатии клавиши "return".

Способ 2: вызывается при нажатии клавиши "return".

Способ 3: глобальный метод записи ввиду загрузки

Примечание: Не забудьте добавить это. Другие мудрые ее не работают.

Читайте также: