Як швидко приховати клавіатуру при натисканні клавіші повернення?


214

Я використовую UITextfiedпід час натискання на текстову клавіатуру, з'являються, але коли я натискаю returnклавішу, клавіатура не зникає. Я використав наступний код:

func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore.
{
    return true;
}

метод resignfirstresponder не отримує функції.


10
Ви розглядали питання про прийняття відповіді RSC? прийняття відповідей - це те, що змушує це місце працювати і вважається хорошою практикою.
Хуан Боеро

7
якщо будь-яка відповідь відповідає вашій вимозі, позначте її як відповідь, щоб інші люди могли отримати в ній допомогу.
Syed Md. Kamruzzaman

Відповіді:


397

Ви можете змусити програму відхиляти клавіатуру за допомогою наступної функції

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true)
    return false
}

Ось повний приклад, щоб краще проілюструвати це:

//
//  ViewController.swift
//
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var myTextField : UITextField

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.myTextField.delegate = self
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }
}

Джерело коду: http://www.snip2code.com/Snippet/85930/swift-delegate-sample


22
Мені не вистачало "self.myTextField.delegate = self;" Дякую!
tylerlindell

4
Мені не вистачало UITextFieldDelegate!
Чезаре

1
@kommradHomer, без сумніву, є щось інше, завдяки чому клавіатура не відображається. Якщо ви хочете, поставте свій код на пастбін та вставте посилання сюди, щоб я його бачив.
rsc

1
@RSC ти, мабуть, мав рацію. Я новичок на 2 дні на ios, тож якось позбувся моєї проблеми і все спрацювало так, як ти запропонував :)
kommradHomer

1
Тож працюй для мене (стрімкий 3): func textFieldShouldReturn(textField: UITextField) -> Bool {зміни на func textFieldShouldReturn(_ textField: UITextField) -> Bool {
морський кг

112

return trueЧастина цього тільки говорить текстове поле це дозволено не повертатися.
Ви повинні вручну повідомити текстове поле, щоб відхилити клавіатуру (або що коли-небудь є її першим відповіддю), і це робиться за допомогою resignFirstResponder():

// Called on 'Return' pressed. Return false to ignore.

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder()
    return true
}

2
дякую ... у моєму випадку метод "resignFirstResponder ()" не отримував автоматично, і я думав, що він не підтримує, але під час написання вручну його добре працює .. дякую, що я шукаю.
Ashwinkumar Mangrulkar

@AshwinMangrulkar можна очікувати, що в бета-версії Xcode 6 функція автоматичного завершення може бути обмежена.
Пол Бревчинський

1
і, звичайно, крапка з комою після "справжнього" більше не потрібна
36 За

1
чи це не вимога, якій відповідає ваш viewController UITextFieldDelegate?
Мед

1
замість self.view.endEditing () ця відповідь підходить і правильний підхід
saigen

45
  • Додати UITextFieldDelegateдо декларації класу:

    class ViewController: UIViewController, UITextFieldDelegate
  • Підключіть textfieldабо запишіть це програмно

    @IBOutlet weak var userText: UITextField!
  • встановіть свій контролер подання як делегат текстових полів у поле перегляду:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
  • Додайте наступну функцію

    func textFieldShouldReturn(userText: UITextField!) -> Bool {
        userText.resignFirstResponder()
        return true;
    }

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


Спасибі людино! Мені цього не вистачало: UITextFieldDelegate... велике спасибі!
Адріано Тадао

З якоїсь причини, коли я встановлюю txtField.delegate = self, я не можу вводити текст під цим текстовим полем, як тільки я запускаю програму
Ісус Родрігес,

@JesusAdolfoRodriguez повинна бути причина цієї помилки, тому цей код не викликає жодних проблем. : D Щасливе кодування!
Codetard

Дякую за крок за кроком. Це було для мене корисніше, ніж просто блок коду.
kenhkelly

1
"при всьому цьому ваша клавіатура почне відхиляти, торкаючись за межами текстового поля" - Неправда. textFieldShouldReturn викликається тільки при натисканні кнопки повернення.
Юрасик

39

Швидкий 4.2 - не потрібен делегат

Ви можете створити розетку дії з UITextField для " Первинної дії, що викликається " та подати у відповідь перший відповідь на параметр відправника, переданий у:

Створіть розетку дій

@IBAction func done(_ sender: UITextField) {
    sender.resignFirstResponder()
}

Супер просто.

(Завдяки 60-секундному відео Скотта Сміта за те, що він підказав мені про це: https://youtu.be/v6GrnVQy7iA )


якщо у нас є кілька текстових полів на сторінці, то чи потрібно це робити для кожного текстового поля ...
DragonFire

@DragonFire Ви можете призначити кілька текстових полів одній розетці. Просто перетягніть з розетки первинної дії в інспектор розетки (ліва частина екрана) до IBAction у своєму коді
Brad Root

Добре зауважити, що перетягування безпосередньо з текстового поля на дошці повідомлень за замовчуванням пов’язана дія буде "Редагування зробив Кінець", а не "Первинна дія", тому це слід зробити з інспектора з’єднань бічної панелі.
Хмара

Дивовижний. Я не знаю, що. Дякую.
Нуман Карааслан

Також працює з Swift 2, якщо хтось все ще байдуже. Дякую.
siralexsir88

22

Simple Swift 3 Рішення: Додайте цю функцію до контролерів перегляду, у яких є текстове поле:

@IBAction func textField(_ sender: AnyObject) {
    self.view.endEditing(true);
}

Потім відкрийте свого помічника редактора і переконайтеся, що і ваша Main.storyboard знаходиться з одного боку вашого перегляду, а потрібний файл controlller.swift - з іншого. Клацніть на текстовому полі, а потім виберіть на правій панелі утиліти панель «Показати інспектор підключення». Контролюйте перетягування з "Здійснено завершення при виході" до вищезгаданої функції у вашому швидкому файлі. Повторіть для будь-якого іншого текстового поля в цій сцені та посилання на ту саму функцію.


14

@RSC

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

 self.input.delegate = self;

Пробував працювати з ключем повернення годинами, поки я не знайшов вашу посаду, RSC. Дякую!

Крім того, якщо ви хочете приховати клавіатуру, якщо торкнутися будь-якого іншого місця на екрані:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true);
    }

12

Щоб отримати автоматичне відхилення клавіатури, я поклав цей код в один із методів класу мого персонального текстового поля:

textField.addTarget(nil, action:"firstResponderAction:", forControlEvents:.EditingDidEndOnExit)

Замініть ім'я торгової мережі на textField.


1
Видатний. Це найкоротший і найкращий варіант, на мою думку. Особливо, коли ви створюєте текстове поле всередині іншого методу. Як і всередині заголовка подання таблиці.
kakubei

Вибачте, де саме потрібно це поставити і що потрібно зробити, щоб закрити клавіатуру? Я помістив mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(версія Swift 5), viewDidLoadале ні повернення, ні натискання десь за межами текстового поля не працювали. Я отримав текстові поля, створивши кожну розетку.
Неф

Я розміщую його в підкласі користувацького класу, який успадковується від UIViewController. Підклас також відповідає UITextViewDelegate та UITextFieldDelegate. Я поклав це в viewDidAppearметод цього класу. UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })Це може бути занадто специфічним для мого випадку, але, сподіваємось, це допомагає. Спробуйте здійснити виклик всередині viewDidAppearта, якщо потрібно, зв’яжіться з будь-якими делегатами.
миролюбність

10

Ще один спосіб зробити це, який здебільшого використовує табло та легко дозволяє вам мати кілька текстових полів:

@IBAction func resignKeyboard(sender: AnyObject) {
    sender.resignFirstResponder()
}

Підключіть усі текстові поля для цього контролера перегляду до цієї дії Did End On Exitподії кожного поля.


Вибачте за помилку, але я намагаюся цей метод у своїй програмі, і він, здається, не працює. На панелі навігації у мене є текстове поле, і я пов’язав це дійство з цією подією, як ви сказали, але воно не працює під час виконання.
wasimsandhu

Це призведе до збоїв, якщо відправник має тип UIBarButtonItem. Якщо я додаю панель інструментів із кнопкою "Готово" на цифровій клавіатурі, то ваш код буде збитий з невпізнаним селектором, надісланим до журналу екземплярів.
Джайпракаш Дюбі

8

Я б запропонував запустити клас з RSC:

import Foundation
import UIKit

// Don't forget the delegate!
class ViewController: UIViewController, UITextFieldDelegate {

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

@IBOutlet var myTextField : UITextField?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.myTextField.delegate = self;
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    self.view.endEditing(true);
    return false;
}

}


8

Коли користувач натискає кнопку «Готово» на текстовій клавіатурі, подія Did End On Exit буде створена; в той час нам потрібно сказати текстовому полі, щоб відмовитися від керування, щоб клавіатура відійшла. Для цього нам потрібно додати метод дій до нашого класу контролерів. Виберіть ViewController.swift додати такий спосіб дії:

@IBAction func textFieldDoneEditing(sender: UITextField) {
sender.resignFirstResponder()}

Виберіть Main.storyboard в «Навігаторі проектів» та відкрийте інспектора з’єднань. Перетягніть з кола поруч із пунктом "Кінець на виході" до жовтої піктограми контролера перегляду на дошці розкадрування та відпустіть. З'явиться невелике спливаюче меню, що містить назву однієї дії, тієї, яку ми щойно додали. Клацніть дію textFieldDoneEditing, щоб вибрати його, і все.


8

Ось оновлення Swift 3.0 до коментаря Peacetype:

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)

це чиста відповідь
po5i

Це має бути прийнятою відповіддю. Працювали з однієї спроби.
Жасвант Сінгх

7

Не люблю додавати ту саму функцію до кожного UIViewController. Розширивши UIViewController на підтримку UITextFieldDelegate, ви можете забезпечити поведінку "повернути натиснуто" за замовчуванням.

extension UIViewController: UITextFieldDelegate{
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true;
    }
}

Коли ви створюєте нові UIViewController та UITextField, все, що вам потрібно зробити, - це написати один код рядка у свій UIViewController.

override func viewDidLoad() {
    super.viewDidLoad()
    textField.delegate = self
}

Ви навіть можете опустити цей код рядка, підключивши делегата в Main.storyboard. (Використовуючи "ctrl" та перетягніть з UITextField до UIViewController)


5

Швидкий 3

Додайте цей код нижче у свій ВК

//hide keyboard when user tapps on return key on the keyboard
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true);
    return false;
}

Працює для мене


3

Переконайтеся, що ваш делегат textField встановлений на контролер перегляду, з якого ви пишете код, пов'язаний з текстовим полем.

self.textField.delegate = self

3

Швидкий

Використання додаткової функції від UITextFieldDelegate.

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    return textField.endEditing(false)
}

falseозначає, що поле можна попросити подати у відставку. true- примусово подати у відставку.


3
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleScreenTap(sender:)))
    self.view.addGestureRecognizer(tap)}

тоді ви використовуєте цю функцію

func handleScreenTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}

2

Ви можете розмістити це де завгодно, але не в UIButton

 func TextFieldEndEditing(text fiend name: UITextField!) -> Bool
{
    return (false)
}

тоді ви можете поставити цей код кнопкою (також, наприклад):

self.view.endEditing(true)

це працювало для мене


2

У контролері подання ви використовуєте:

//suppose you are using the textfield label as this

@IBOutlet weak var emailLabel: UITextField!
@IBOutlet weak var passwordLabel: UITextField!

//then your viewdidload should have the code like this
override func viewDidLoad() {
        super.viewDidLoad()

        self.emailLabel.delegate = self
        self.passwordLabel.delegate = self

    }

//then you should implement the func named textFieldShouldReturn
 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

// -- then, further if you want to close the keyboard when pressed somewhere else on the screen you can implement the following method too:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true);
    }

Мені подобаються штрихиBegan func, працює в швидкому 4 дякую.
AJ Ернандес


-1

"Все в одному" приховати клавіатуру та відкрити перегляд на клавіатурі відкрито: Swift 5

override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: self, action: #selector(taped))
    view.addGestureRecognizer(tap)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}


   override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
 @objc func taped(){

    self.view.endEditing(true)

}

@objc func KeyboardWillShow(sender: NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y == 0{
        self.view.frame.origin.y -= keyboardSize.height
    }


}

@objc func KeyboardWillHide(sender : NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y != 0{
        self.view.frame.origin.y += keyboardSize.height
    }

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.