Jak szybko ukryć klawiaturę po naciśnięciu klawisza Return?


214

Korzystam z UITextfiedkliknięcia wyświetlanej klawiatury tekstowej, ale po naciśnięciu returnklawisza klawiatura nie znika. Użyłem następującego kodu:

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

metoda resignfirstresponder nie wchodzi w funkcję.


10
czy rozważałeś przyjęcie odpowiedzi RSC? przyjmowanie odpowiedzi sprawia, że ​​to miejsce działa i jest uważane za dobrą praktykę.
— Juan Boero,

7
jeśli jakakolwiek odpowiedź spełnia twoje wymagania, zaznacz ją jako odpowiedź, aby inne osoby mogły uzyskać od niej pomoc.
— Syed Md. Kamruzzaman

Odpowiedzi:


397

Możesz sprawić, że aplikacja zwolni klawiaturę, korzystając z następującej funkcji

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

Oto pełny przykład, aby lepiej to zilustrować:

//
//  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
    }
}

Źródło kodu: http://www.snip2code.com/Snippet/85930/swift-delegate-sample


22
Brakowało mi „self.myTextField.delegate = self;” Dziękuję Ci!
— tylerlindell

4
Brakowało mi UITextFieldDelegate!
— Cesare

1
@kommradHomer, bez wątpienia jest coś jeszcze, co sprawia, że ​​klawiatura się nie wyświetla. Jeśli chcesz, umieść kod na pastebin i wklej tutaj link, aby go zobaczyć.
— rsc

1
@RSC najprawdopodobniej miałeś rację. Jestem 2-dniowym nowicjuszem na iOS, więc jakoś pozbyłem się mojego problemu i wszystko działało tak, jak sugerowałeś :)
— kommradHomer

1
Więc pracuj dla mnie (szybkie 3): func textFieldShouldReturn(textField: UITextField) -> Bool {zmień na func textFieldShouldReturn(_ textField: UITextField) -> Bool {
— morze-kg

112

return trueCzęść to tylko mówi pole tekstowe czy nie jest dozwolone, aby powrócić.
Musisz ręcznie powiedzieć polu tekstowemu, aby odrzuciło klawiaturę (lub cokolwiek to jest jej pierwsza odpowiedź), i można to zrobić za pomocą resignFirstResponder():

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

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

2
dzięki ... w moim przypadku metoda „resignFirstResponder ()” nie otrzymywała się automatycznie i myślałem, że nie obsługuje, ale podczas ręcznego pisania działa dobrze .. dzięki, że szukam.
— Ashwinkumar Mangrulkar

@AshwinMangrulkar można się spodziewać, że w wersji beta funkcji automatycznego uzupełniania Xcode 6 może być upośledzona.
— Paul Brewczynski

1
i oczywiście średnik po „true” nie jest już wymagany
— 36 By Design

1
czy nie jest to wymagane, aby Twój viewController był zgodny UITextFieldDelegate?
— Honey

1
zamiast self.view.endEditing () ta odpowiedź jest właściwa i prawidłowe podejście
— saigen

45
  • Dodaj UITextFieldDelegatedo deklaracji klasy:

    class ViewController: UIViewController, UITextFieldDelegate
  • Podłącz textfieldlub napisz programowo

    @IBOutlet weak var userText: UITextField!
  • ustaw kontroler widoku, tak jak załadowano delegowane pola tekstowe w widoku:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
  • Dodaj następującą funkcję

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

    po tym wszystkim klawiatura zacznie się odsuwać, dotykając również poza polem tekstowym, a także naciskając klawisz powrotu.


Dzięki! Brakowało mi tego: UITextFieldDelegate... wielkie dzięki!
— Adriano Tadao

Z jakiegoś powodu, gdy ustawiam txtField.delegate = self, nie mogę pisać w tym polu tekstowym po uruchomieniu aplikacji
— Jesus Rodriguez

@JesusAdolfoRodriguez musi istnieć przyczyna tego błędu, ponieważ ten kod nie powoduje żadnego problemu. : D Szczęśliwego kodowania!
— Kodówka

Dziękuję za krok po kroku. To było dla mnie bardziej pomocne niż tylko blok kodu.
— kenhkelly

1
„Po tym wszystkim klawiatura zacznie się wyłączać, dotykając poza polem tekstowym” - nieprawda. TextFieldShouldReturn jest wywoływany tylko po naciśnięciu przycisku powrotu.
— Jurajski

39

Swift 4.2 - Nie potrzeba delegata

Możesz utworzyć ujście akcji z pola UITextField dla „ Wyzwolonej akcji podstawowej ” i zrezygnować z pierwszej odpowiedzi na przekazany parametr nadawcy:

Utwórz Action Outlet

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

Super proste.

(Dzięki 60-sekundowemu filmowi Scotta Smitha za poinformowanie mnie o tym: https://youtu.be/v6GrnVQy7iA )


jeśli mamy wiele pól tekstowych na stronie, to musimy to zrobić dla każdego pola tekstowego ...
— DragonFire

@DragonFire Możesz przypisać wiele pól tekstowych do tego samego gniazdka. Po prostu przeciągnij z gniazda Wyzwalanie akcji podstawowej w inspektorze gniazd (lewa strona ekranu) do IBAction w swoim kodzie
— Brad Root

Warto zauważyć, że przeciągnięcie bezpośrednio z pola tekstowego w serii ujęć spowoduje domyślną akcję połączoną do Edycja zakończona, a nie akcję podstawową, więc należy to zrobić z poziomu Inspektora połączeń na pasku bocznym.
— Chmura

Niesamowity. Nie wiedziałem tego. Dzięki.
— Numan Karaaslan

Działa również z Swift 2, jeśli komukolwiek to zależy. Dzięki.
— siralexsir88

22

Proste rozwiązanie Swift 3: Dodaj tę funkcję do kontrolerów widoku zawierających pole tekstowe:

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

Następnie otwórz asystenta edytora i upewnij się, że zarówno Main.storyboard znajduje się po jednej stronie widoku, jak i żądany plik kontrolera widoku.swift po drugiej stronie. Kliknij pole tekstowe, a następnie wybierz z panelu narzędzi po prawej stronie kartę „Pokaż Inspektora połączeń”. Przeciągnij kontrolkę z „Did End on Exit” do powyższej funkcji w swoim szybkim pliku. Powtórz dla każdego innego pola tekstowego w tej scenie i połącz z tą samą funkcją.


14

@RSC

dla mnie krytyczny dodatek w wersji Xcode 6.2 (6C86e) jest już dostępny override func viewDidLoad()

 self.input.delegate = self;

Próbowałem godzinami pracować z kluczem powrotu, aż znalazłem twój post, RSC. Dziękuję Ci!

Ponadto, jeśli chcesz ukryć klawiaturę, jeśli dotkniesz gdziekolwiek indziej na ekranie:

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

12

Aby uzyskać automatyczne odrzucanie klawiatury, umieściłem ten kod w jednej z metod klasy mojego niestandardowego pola tekstowego:

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

Zastąp nazwę swojego punktu sprzedaży textField.


1
Wybitny. To moim zdaniem najkrótsza i najlepsza opcja. Zwłaszcza gdy tworzysz pole tekstowe w innej metodzie. Jak w nagłówku widoku tabeli.
— kakubei

Przepraszam, gdzie dokładnie musisz to umieścić i co musisz zrobić, aby zamknąć klawiaturę? Umieściłem mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(wersja Swift 5), viewDidLoadale nie działało ani powrót, ani stukanie poza polem tekstowym. Mam pola tekstowe, tworząc każde z nich.
— Neph

Umieszczam go w podklasie klasy niestandardowej, która dziedziczy po UIViewController. Podklasa jest również zgodna z UITextViewDelegate i UITextFieldDelegate. Umieściłem to w viewDidAppearmetodzie tej klasy. UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })Może to być nieco zbyt specyficzne dla mojej sprawy, ale mam nadzieję, że to pomaga. Spróbuj nawiązać połączenie wewnątrz viewDidAppeariw razie potrzeby dostosować się do delegatów.
— typ pokoju

10

Innym sposobem na zrobienie tego, który głównie wykorzystuje scenorys i łatwo pozwala mieć wiele pól tekstowych jest:

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

Połącz wszystkie pola tekstowe dla tego kontrolera widoku z tą akcją w Did End On Exitprzypadku każdego pola.


Przepraszam za przeszkodę, ale próbuję tej metody w mojej aplikacji i wydaje się, że nie działa. Mam pole tekstowe na pasku nawigacyjnym i połączyłem je z tym wydarzeniem z tym wydarzeniem, ale nie działa w czasie wykonywania.
— wasimsandhu

To się zawiesiłoby, jeśli nadawca jest typu UIBarButtonItem. Jeśli dodam pasek narzędzi z przyciskiem Gotowe do klawiatury numerycznej, wówczas twój kod musi ulec awarii z nierozpoznanym selektorem wysłanym do dziennika instancji.
— Jayprakash Dubey

8

Sugerowałbym zainicjowanie zajęć z 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

Gdy użytkownik stuknie przycisk Gotowe na klawiaturze tekstowej, zostanie wygenerowane zdarzenie Did End On Exit; w tym czasie musimy powiedzieć polu tekstowemu, aby zrezygnowało z kontroli, aby klawiatura zniknęła. W tym celu musimy dodać metodę akcji do naszej klasy kontrolera. Wybierz ViewController.swift dodaj następującą metodę działania:

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

Wybierz Main.storyboard w Project Navigator i otwórz inspektora połączeń. Przeciągnij z koła obok Did End On Exit do żółtej ikony kontrolera widoku w serii ujęć i puść. Pojawi się małe menu podręczne zawierające nazwę pojedynczego działania, tego, które właśnie dodaliśmy. Kliknij akcję textFieldDoneEditing, aby ją wybrać i to wszystko.


8

Oto aktualizacja Swift 3.0 do komentarza typu peacetype:

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

to jest czysta odpowiedź
— po5i

To powinna być zaakceptowana odpowiedź. Pracowałem za jednym razem.
— Jaswant Singh

7

Nienawidzę dodawać tej samej funkcji do każdego UIViewController. Rozszerzając UIViewController o obsługę UITextFieldDelegate, możesz zapewnić domyślne zachowanie „powrót wciśnięty”.

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

Kiedy tworzysz nowy UIViewController i UITextField, wszystko co musisz zrobić, to napisać jeden kod linii w UIViewController.

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

Możesz nawet pominąć ten jeden kod linii, podpinając delegata na Main.storyboard. (Używając „ctrl” i przeciągnij z UITextField do UIViewController)


5

Szybki 3

Dodaj ten kod poniżej do swojego VC

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

Pracuje dla mnie


3

Upewnij się, że Twój delegat textField jest ustawiony na kontroler widoku, z którego piszesz kod związany z polem tekstowym.

self.textField.delegate = self

3

Szybki

Korzystanie z funkcji opcjonalnej od UITextFieldDelegate.

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

falseoznacza, że ​​pole można poprosić o rezygnację. true- wymusić rezygnację.


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

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

wtedy użyjesz tej funkcji

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

2

możesz umieścić to w dowolnym miejscu, ale nie w UIButton

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

następnie możesz umieścić ten kod w przycisku (również na przykład):

self.view.endEditing(true)

to działało dla mnie


2

W kontrolerze widoku używasz:

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

Lubię touchingsBegan func, działa w szybkim 4 dziękuję.
— AJ Hernandez,


-1

All in One Hide Keyboard and Move View on Keyboard Open: 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
    }

}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.