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.