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

215

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

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

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

Ашвинкумар Мангрулкар
источник
10
Вы рассматривали возможность принятия ответа RSC? Принятие ответов - вот что заставляет это место работать и считается хорошей практикой.
Хуан Боэро
7
если какой-либо ответ соответствует вашему требованию, отметьте его как ответ, чтобы другие люди могли получить от него помощь.
Сайед Мд. Камруззаман

Ответы:

398

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

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

RSC
источник
22
Мне не хватало "self.myTextField.delegate = self;" Спасибо!
Tylerlindell
4
Я скучал по UITextFieldDelegate!
Чезаре
1
@kommradHomer, без сомнения, есть что-то еще, что заставляет вашу клавиатуру не показывать. Если хотите, поместите свой код на pastebin и вставьте ссылку здесь, чтобы я его увидел.
rsc
1
@RSC вы, скорее всего, были правы. я новичок на ios 2 дня, так что как-то избавился от моей проблемы, и все
заработало так,
1
Так что работай для меня (swift 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 () не получал автоматически, и я подумал, что он не поддерживает, но при написании вручную работает нормально ... спасибо, что я ищу.
Ашвинкумар Мангрулкар
@AshwinMangrulkar вы можете ожидать, что в бета-версии Xcode 6 функция автоматического завершения может быть отключена.
Павел Бревчински
1
и, конечно, точка с запятой после «true» больше не требуется
36 By Design
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;
    }

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

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

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

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

Создать действие Outlet

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

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

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

Марк Мойкенс
источник
если у нас есть несколько текстовых полей на странице , то мы должны сделать это для каждого текстового поля ...
DragonFire
@DragonFire Вы можете назначить несколько текстовых полей для одного выхода. Просто перетащите из розетки «Первичное действие» в инспекторе розеток (левая сторона экрана) на IBAction в своем коде
Брэд Рут,
Следует отметить, что при перетаскивании непосредственно из текстового поля в раскадровке связанное действие по умолчанию будет «Редактировать завершенный» вместо «Основное действие, инициируемое», поэтому его следует выполнять из инспектора соединений боковой панели.
Облако
Удивительный. Я не знал этого. Спасибо.
Нуман Карааслан
1
Огромное спасибо. Это именно то, что мне было нужно. Мне нужно было отклонить клавиатуру кнопкой возврата в ячейке таблицы. Работает отлично.
piddler
22

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

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

Затем откройте ваш помощник редактора и убедитесь, что ваш Main.storyboard находится на одной стороне вашего представления, а требуемый файл controller.swift вида находится на другой. Щелкните по текстовому полю и затем выберите на правой панели утилит панель «Показать Инспектор соединений». Управляйте перетаскиванием из «Did End on Exit» в указанную выше функцию в вашем файле swift. Повторите эти действия для любого другого текстового поля в этой сцене и укажите ссылку на ту же функцию.

elarcoiris
источник
14

@RSC

для меня критическое дополнение в Версии 6.2 Xcode (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.

peacetype
источник
1
Отлично. Это самый короткий и лучший вариант на мой взгляд. Особенно, когда вы создаете текстовое поле внутри другого метода. Как внутри заголовка табличного представления.
Какубей
Извините, где именно вы должны положить это и что вы должны сделать, чтобы закрыть клавиатуру? Я поместил 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событием каждого поля.

Джеймс Томпсон
источник
Извините за удар, но я пытаюсь этот метод в моем приложении, и он, кажется, не работает. У меня есть текстовое поле на панели навигации, и я связал его с этим действием с тем событием, как вы сказали, но оно не работает во время выполнения.
Васимсандху
Это приведет к сбою, если отправитель имеет тип 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;
}

}

LAOMUSIC ARTS
источник
8

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

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

Выберите Main.storyboard в Project Navigator и вызовите инспектор соединений. Перетащите из круга рядом с надписью «Завершить при выходе» на желтый значок View Controller в раскадровке и отпустите. Появится небольшое всплывающее меню с названием одного действия, которое мы только что добавили. Нажмите на действие 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

Добавьте этот код ниже к вашему VC

//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
Miladinho
источник
3

стриж

Используя опциональную функцию из UITextFieldDelegate.

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

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

dimpiax
источник
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);
    }
Канишк Верма
источник
Мне нравятся штрихи Beg func, работает в swift 4 спасибо.
AJ Эрнандес
-1

Вы должны соединить UITextfied с контроллером делегата представления, чтобы эта функция называлась

Абдулрахман Масуд
источник
-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
    }

}
Имран Рашид
источник