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


148

Kliknięcie pola tekstowego powoduje wyświetlenie klawiatury. Jak to ukryć, gdy użytkownik naciśnie klawisz powrotu?


13
Zaletą przepełnienia stosu jest to, że udzielono już odpowiedzi na WIELE pytań, zwłaszcza tych prostych. Dlatego najpierw poszukaj odpowiedzi, zanim zapytasz. Widzisz, to proste: stackoverflow.com/search?q=iphone+hide+keyboard
Felixyz

To jest podklasa UITextfield, która dynamicznie zmienia UIReturnKey zgodnie z warunkiem tekstu / ciągu: github.com/codeinteractiveapps/OBReturnKeyTextField
CodeInteractive

Odpowiedzi:


286

Najpierw ustaw delegata pliku dla UITextField

@interface MYLoginViewController () <UITextFieldDelegate>

@end

Następnie dodaj tę metodę do swojego kodu.

- (BOOL)textFieldShouldReturn:(UITextField *)textField {        
    [textField resignFirstResponder];
    return YES;
}

Dodaj także self.textField.delegate = self;


1
Ciekawe, dlaczego <UITextFieldDelegate> nie jest konieczne? Zwykle w takim przypadku zobaczysz ostrzeżenie.
pixelfreak

7
jeśli zrobisz plik delegata za pomocą interfejsu Builder następnie <UITextFieldDelegate> nie jest konieczne w pliku .h ..
Saurabh

1
dodanie <UITextFieldDelegate> w pliku .h i ustawienie delegata w viewdidload [yourTextField setDelegate: self]; zakończy to!
Umit Kaya,

@Saurabh Co jest takiego specjalnego w VC utworzonym przez storyboard?
Paul Brewczyński

62

W viewDidLoadoświadczeniu:

[yourTextField setDelegate:self];

Następnie uwzględnij przesłonięcie metody delegata:

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

6
+1 dla setDelegate:przypomnienia. Zdecydowanie zapomniałem, a kod wcześniej nie działał.
piperchester,

2
Czy nie powinno to być pole tekstowe, a nie yourTextField, gdy jest przekazywane?
Clive Jefferies,

to sposób na powiedzenie, który deklaruje delegata swojego tekstu Pole
oscar castellon

1
<UITextFieldDelegate> powinno znajdować się w pliku .h, w przeciwnym razie pojawi się ostrzeżenie!
Umit Kaya,

22

Spróbuj tego w Swift ,

Krok 1: Ustaw delegata jako siebietextField

textField.delegate = self

Krok 2: Dodaj to UITextFieldDelegate poniżej deklaracji klasy,

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

14

Szybko zrób tak:
Najpierw w swoim urządzeniu ViewControllerto UITextFieldDelegate Na przykład.

class MyViewController: UIViewController, UITextFieldDelegate {
....
}

Teraz dodaj delegata do, TextFieldw którym chcesz odrzucić klawiaturę po dotknięciu powrotu w viewDidLoadmetodzie jak poniżej lub w miejscu, w którym ją inicjujesz. Np.

override func viewDidLoad() {

    super.viewDidLoad()   
    myTextField.delegate = self
}

Teraz dodaj tę metodę.

func textFieldShouldReturn(textField: UITextField) -> Bool {

    textField.resignFirstResponder()
    return true
}

1
Drugi krok nie jest konieczny, jeśli ustawisz delegata w IB.
hris.to

Pojawia się (w obecnych wersjach Swift) podkreślenie przed „textField:”
Bryce Sandlund

2

Spróbuj tego,

[textField setDelegate: self];

Następnie w metodzie delegata textField

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

to nie jest najlepsza praktyka.
orafaelreis

wymaga UITextFieldDelegate w definicji interfejsu.
Alp Altunel

@AlpAltunel: Dzięki za komentarz, to było 4 lata temu.
Vineesh TP

1

set delegate of UITextFieldi over ride textFieldShouldReturn, w tej metodzie po prostu napisz następujące dwa wiersze:

[textField resignFirstResponder];
return YES;

Otóż ​​to. Przed napisaniem kodu nie zapomnij ustawić delegata a UITextFieldi ustawić typ klawisza Return na „Gotowe” w oknie właściwości (polecenie + shift + I).


1

Możesz połączyć "Primary Action Triggered" (kliknij prawym przyciskiem na UITextField) z IBAction i możesz zrezygnować z pierwszej odpowiedzi (bez delegowania). Przykład (Swift 4):

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

Preferowany sposób korzystania ze scenorysów.
lal

1

Szybki 4

Ustaw delegata UITextFieldw widoku kontrolera field.delegate = self, a następnie:

extension ViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // don't force `endEditing` if you want to be asked for resigning
        // also return real flow value, not strict, like: true / false
        return textField.endEditing(false)
    }
}

jak poradziłbyś sobie z żądaniem, aby użytkownicy przechodzili tabulatorem do następnego pola tekstowego po naciśnięciu klawisza Return, aż do ostatniego, a następnie rezygnuje? Również w SwiftUI.
Learn2Code

@ Learn2Code stwórz managera, zbieraj pola tekstowe i łańcuch, ostatni wyzwoli funkcję zakończenia.
dimpiax

1

Jeśli chcesz ukryć klawiaturę dla określonej klawiatury, użyj opcji [self.view resignFirstResponder]; Jeśli chcesz ukryć klawiaturę przed wyświetlaniem, użyj[self.view endEditing:true];



0

Ok, myślę, że dla nowicjusza sytuacja może być nieco zagmatwana. Myślę, że prawidłowa odpowiedź to połączenie wszystkich powyższych, przynajmniej w Swift4.

Utwórz rozszerzenie lub użyj ViewController, w którym chcesz tego użyć, ale pamiętaj, aby zaimplementować UITextFieldDelegate. Ze względu na możliwość ponownego wykorzystania okazało się, że łatwiej jest użyć rozszerzenia:

extension UIViewController : UITextFieldDelegate {
    ...
}

ale alternatywa również działa:

class MyViewController: UIViewController {
    ...
}

Dodaj metodę textFieldShouldReturn (w zależności od poprzedniej opcji, w rozszerzeniu lub w ViewController)

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

W metodzie viewDidLoad ustaw delegata pola tekstowego na siebie

@IBOutlet weak var myTextField: UITextField!
...

override func viewDidLoad() {
    ..
    myTextField.delegte = self;
    ..
}

To powinno być wszystko. Teraz, po naciśnięciu powinien być nazywany.returntextFieldShouldReturn


0

Zdefiniuj tę klasę, a następnie ustaw pole tekstowe tak, aby korzystało z tej klasy, a to zautomatyzuje całą ukrytą klawiaturę po automatycznym naciśnięciu klawisza return.

class TextFieldWithReturn: UITextField, UITextFieldDelegate
{

    required init?(coder aDecoder: NSCoder) 
    {
        super.init(coder: aDecoder)
        self.delegate = self
    }

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

}

Następnie wszystko, co musisz zrobić w scenorysie, to ustawić pola do użycia klasy:

wprowadź opis obrazu tutaj

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.