Как спрятать клавиатуру в swift при нажатии клавиши возврата?

167

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

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

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

  • 9
    Вы рассматривали возможность принятия ответа RSC? Принятие ответов - вот что заставляет это место работать и считается хорошей практикой.
  • 6
    если какой-либо ответ соответствует вашему требованию, отметьте его как ответ, чтобы другие люди могли получить от него помощь.
Теги:
uitextfield

16 ответов

332

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

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

  • 21
    Мне не хватало "self.myTextField.delegate = self;" Спасибо!
  • 4
    Мне не хватало UITextFieldDelegate !
Показать ещё 11 комментариев
83

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

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

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder()
    return true
}
  • 2
    спасибо ... в моем случае метод resignFirstResponder () не получал автоматически, и я подумал, что он не поддерживает, но при написании вручную работает нормально ... спасибо, что я ищу.
  • 0
    @AshwinMangrulkar вы можете ожидать, что в бета-версии Xcode 6 функция автоматического завершения может быть отключена.
Показать ещё 4 комментария
44
  • Добавьте 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;
    }
    

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

  • 0
    Спасибо чувак! Мне не хватало этого: UITextFieldDelegate ... большое спасибо!
  • 0
    По какой-то причине, когда я устанавливаю txtField.delegate = self, я не могу печатать в этом текстовом поле после запуска приложения.
Показать ещё 3 комментария
22

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

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

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

12

@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); }

11

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

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

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

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

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

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

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

  • 0
    Извините за удар, но я пытаюсь этот метод в моем приложении, и он, кажется, не работает. У меня есть текстовое поле на панели навигации, и я связал его с этим действием с тем событием, как вы сказали, но оно не работает во время выполнения.
  • 0
    Это приведет к сбою, если отправитель имеет тип UIBarButtonItem. Если я добавлю панель инструментов с кнопкой «Готово» на цифровую клавиатуру, то ваш код обязательно потерпит неудачу с нераспознанным селектором, отправленным в журнал экземпляра.
8

Когда пользователь нажимает кнопку "Готово" на текстовой клавиатуре, будет создано событие "Завершить выход"; в то время нам нужно сообщить текстовому полю, чтобы он отказался от контроля, чтобы клавиатура исчезла. Для этого нам нужно добавить метод действия к нашему классу контроллера. Выберите ViewController.swift, добавьте следующий метод действий:

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

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

7

Я бы очень хотел запустить класс из 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;
}

}

6

Здесь обновление Swift 3.0 для комментария peacetype:

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)
  • 0
    это чистый ответ
5

Swift 3

Добавьте этот код ниже в свой VC

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

Работает для меня

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);
    }
  • 0
    Мне нравятся штрихи Began func, работает в swift 4 спасибо.
2

Swift

Использование необязательной функции из UITextFieldDelegate.

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

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

2

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

self.textField.delegate = self
1

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

Вы можете создать выход действия из UITextField для " Первичного инициируемого действия " и отправить в отставку первого респондента по параметру отправителя, переданному в:

Изображение 1809

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

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

(Спасибо Скотту Смиту за 60-секундное видео за сообщение об этом: https://youtu.be/v6GrnVQy7iA)

1

вы можете поместить это где угодно, но не в UIButton

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

то вы можете поместить этот код в кнопку (также, например):

self.view.endEditing(true)

это сработало для меня

Ещё вопросы

Сообщество Overcoder
Наверх
Меню