Jak wyłączyć klawiaturę podczas edycji UITextField

Wiem, że muszę powiedzieć mojemu UITextField, aby zrezygnował z pierwszej odpowiedzi, gdy chcę zdemontować klawiaturę, ale nie jestem pewien, jak dowiedzieć się, kiedy użytkownik nacisnął klawisz "gotowe" na klawiaturze. Czy jest jakieś powiadomienie, na które mogę patrzeć?

Author: TheNeil, 2008-11-08

22 answers

Ustawiłem delegata UITextField na moją klasę ViewController.

W tej klasie zaimplementowałem tę metodę w następujący sposób:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}
 353
Author: kubi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-01 20:05:01

Jeśli połączysz Zdarzenie DidEndOnExit pola tekstowego z akcją (IBAction) w Interfejsiebuilder, zostanie ono wysłane, gdy użytkownik odrzuci klawiaturę (klawiszem return), a nadawca będzie odniesieniem do pola UITextField, które wywołało Zdarzenie.

Na przykład:

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

Następnie, w Interfejsiebuilder, połącz Zdarzenie DidEndOnExit pola tekstowego z tą akcją na kontrolerze (lub czymkolwiek używasz do łączenia zdarzeń z interfejsu użytkownika). Ilekroć użytkownik wprowadzi tekst i odrzuca pole tekstowe, kontroler zostanie wysłany tę wiadomość.

 47
Author: Jason Coco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-04 20:27:56

Możesz również utworzyć metodę w kontrolerze

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

A następnie W Connection Inspector w zdarzeniu IB connect "Did End On Exit" do niego.

 32
Author: Hugo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-01 20:20:55

Kubi, dzięki. Twój kod zadziałał. Aby być jawnym (dla początkujących), jak mówisz, musisz ustawić UITextField ' s delegate na równe ViewController, w którym znajduje się pole tekstowe. Możesz to robić, gdzie tylko zechcesz. Wybrałem metodę viewDidLoad.

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}
 19
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-18 13:20:44

Oto sztuczka, aby uzyskać automatyczne zwolnienie klawiatury bez kodu w ogóle. W nib Edytuj obiekt proxy pierwszej odpowiedzi w Inspektorze tożsamości, dodając nową akcję pierwszej odpowiedzi; nazwijmy ją dummy:. Teraz zaczep Zdarzenie Did End on Exit pola tekstowego do akcji dummy: obiektu Proxy First Responder. To jest to! Ponieważ zdarzenie End on Exit ma teraz parę akcja-cel, pole tekstowe automatycznie odrzuca klawiaturę, gdy użytkownik dotknie Return; a ponieważ nie ma kary za nie znalezienie obsługi dla wiadomości wysłanej w łańcuchu odpowiedzi, aplikacja nie zawiesza się, nawet jeśli nie ma implementacji dummy: gdziekolwiek.

 18
Author: matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-14 22:51:33

Po prostu dodaj

[textField endEditing:YES];

Gdzie chcesz wyłączyć klawiaturę i wyświetlić widok wyboru.

 11
Author: user415897,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-28 20:16:47

W języku Swift można zapisać IBAction w kontrolerze i ustawić Did End przy wyjściu Zdarzenie pola tekstowego do tej akcji

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}
 10
Author: Safin Ahmed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-08 23:22:18

Swift 4.2 i będzie działać w 100%

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        self.textField.delegate = self

    }

    // hide key board when the user touches outside keyboard

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

    // user presses return key

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

}
 8
Author: Gulsan Borbhuiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-09 03:50:58

Możesz również użyć

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  {

   [self.yourTextField resignFirstResponder];

  }

Najlepszy jeśli masz wiele Uitextfields :

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {    
     [self.view endEditing:YES];
 }
 4
Author: Metalhead1247,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-15 04:50:52

[[3]} Oto, co musiałem zrobić, aby go uruchomić, i myślę, że jest to konieczne dla każdego, kto ma klawiaturę numeryczną (lub inne bez przycisku done:

  1. zmieniłem UIView w ViewController na UIControl.
  2. Stworzyłem funkcję o nazwie

    -(IBAction)backgroundIsTapped:(id)sender
    

Zostało to również zdefiniowane w .plik H.

Po tym, połączyłem się z bitem "dotknięcia" dla Viewcontrollera w Interface Builder.

In the 'background is tapped' function, I put this:

    [answerField resignFirstResponder];

Pamiętaj tylko, aby zmienić 'answerField' na nazwę UITextField, z którego chcesz usunąć klawiaturę (oczywiście upewnij się, że Twój UITextField jest zdefiniowany jak poniżej:)

    IBOutlet UITextField * <nameoftextfieldhere>;
Wiem, że ten temat umarł dawno temu... ale mam nadzieję, że to komuś pomoże, gdzieś!
 2
Author: Ryan Bourne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 16:52:57

Zauważysz, że metoda "textFieldShouldReturn" dostarcza obiekt pola tekstowego, który nacisnął klawisz DONE. Jeśli ustawisz znacznik, możesz włączyć to pole tekstowe. Możesz też śledzić i porównywać wskaźnik obiektu z pewną wartością składową przechowywaną przez jego twórcę.

Moje podejście do samodzielnej nauki Jest Takie:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    bool fDidResign = [textField resignFirstResponder];

    NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");

    return fDidResign;
}

Tymczasem umieszczam test "walidacji", który zaprzecza rezygnacji. Jest to tylko dla ilustracji, więc jeśli użytkownik wpisze nr! w polu, to nie odrzuci. Zachowanie było takie, jak chciałem, ale sekwencja wyjścia nie była taka, jak oczekiwałem.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    if( [[textField text] isEqualToString:@"NO!"] ) {
        NSLog(@"%@", textField.text);
        return NO;
    } else {
        return YES;
    }
}

Poniżej znajduje się moje wyjście NSLog dla tej odmowy, a następnie akceptacja. Zauważysz, że zwracam wynik rezygnacji, ale spodziewałam się, że zwróci się do mnie fałszywie, aby zgłosić się do rozmówcy?! Poza tym ma niezbędne zachowanie.

13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
13.327 StudyKbd[109:207] NO!
13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO
59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
 2
Author: mobibob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-18 13:16:21

Oto całkiem czysty sposób na zakończenie edycji za pomocą klawisza powrotu lub dotknięcia w tle.

W Interface builder osadzaj swoje pola w widoku klasy UIFormView

Co robi ta klasa:

  • automatycznie dołącza się jako delegat pól (obudzony z nib lub dodany ręcznie)
  • Zachowaj odniesienie w bieżącym edytowanym polu
  • Wyłącz klawiaturę po powrocie lub dotknięciu w tle

Oto kod :

interfejs

#import <UIKit/UIKit.h>

@interface UIFormView : UIView<UITextFieldDelegate>

-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;

@end

realizacja

#import "UIFormView.h"

@implementation UIFormView
{
    UITextField* currentEditingTextField;
}

// Automatically register fields

-(void)addSubview:(UIView *)view
{
    [super addSubview:view];
    if ([view isKindOfClass:[UITextField class]]) {
        if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
    }
}

// UITextField Protocol

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    currentEditingTextField = textField;
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    currentEditingTextField = NULL;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self endEdit];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if ([self textFieldValueIsValid:textField]) {
        [self endEdit];
        return YES;
    } else {
        return NO;
    }
}

// Own functions

-(void)endEdit
{
    if (currentEditingTextField) {
        [currentEditingTextField endEditing:YES];
        currentEditingTextField = NULL;
    }
}


// Override this in your subclass to handle eventual values that may prevent validation.

-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
    return YES;
}

@end
  • Poprzez podklasowanie formularza i nadpisanie textFieldValueIsValid: method, you można uniknąć zakończenia edycji, jeśli wartość nie jest poprawna dla podanego pole.

  • Jeśli pole ma delegata ustawionego w Kreatorze interfejsów, to Formularz go nie zmienia. Nie widzę wielu powodów, aby ustawić inny delegat do konkretnego pola, ale dlaczego nie ...

Jest wiele sposobów na poprawę ta klasa widoku formularza-Załącz delegata, wykonaj jakiś układ, obsłuż gdy klawiatury zakrywają pole (używając bieżącej ramki), automatycznie rozpocznij edycję dla następnego pola, ...

Osobiście trzymam go w moim frameworku i zawsze podklasuję go, aby dodać funkcje, Jest to dość często przydatne "tak, jak jest".

Mam nadzieję, że to pomoże. Pozdrawiam wszystkich
 1
Author: Moose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-08 01:08:48

Jeśli chcesz całą edycję w UIViewController możesz użyć.

[[self view]endEditing:YES];

A jeśli chcesz usunąć perticular UITextField Keyboard hide to użyj.

1.dodaj delegata do kontrolera viewcontroller.h

<UITextFieldDelegate>
  1. Sprawi, że delegacja nie będzie mogła zostać wysłana do twojego pola tekstowego .

    Siebie.yourTextField.delegate = self;

  2. Dodaj tę metodę do kontrolera viewcontroller.

    -(BOOL)textFieldShouldEndEditing: (UITextField *)textField{ [textField / align = "left" / ]; return YES;}

 1
Author: Abhimanyu Rathore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-03 10:25:29

Programowo ustawia delegata UITextField w swift 3

Zaimplementuj UITextFieldDelegate w kontrolerze ViewController.Plik Swift (np. Klasa ViewController: UIViewController, UITextFieldDelegate { )

 lazy var firstNameTF: UITextField = {

    let firstname = UITextField()
    firstname.placeholder = "FirstName"
    firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
    firstname.textAlignment = .center
    firstname.borderStyle = UITextBorderStyle.roundedRect
    firstname.keyboardType = UIKeyboardType.default
    firstname.delegate = self
    return firstname
}()

lazy var lastNameTF: UITextField = {

    let lastname = UITextField()
    lastname.placeholder = "LastName"
    lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
    lastname.textAlignment = .center
    lastname.borderStyle = UITextBorderStyle.roundedRect
    lastname.keyboardType = UIKeyboardType.default
    lastname.delegate = self
    return lastname
}()

lazy var emailIdTF: UITextField = {

    let emailid = UITextField()
    emailid.placeholder = "EmailId"
    emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
    emailid.textAlignment = .center
    emailid.borderStyle = UITextBorderStyle.roundedRect
    emailid.keyboardType = UIKeyboardType.default
    emailid.delegate = self
    return emailid
}()

/ / Mark:- obsługa pola tekstowego delegata..

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.endEditing(true)
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    if textField == firstNameTF {

        lastNameTF.becomeFirstResponder()
    }

    else if textField == lastNameTF {

        emailIdTF.becomeFirstResponder()
    }
    else {
        view.emailIdTF(true)
    }
    return true
}
 1
Author: Tanjima Kothiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-28 05:27:08

Utwórz funkcję hidekeyboard i połącz ją z pole tekstowe w .plik xib i wybierz DidEndOnExit

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  
 0
Author: pooja_chaudhary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-12 10:12:12

Jeśli został utworzony Widok za pomocą narzędzia Interface Builder, Użyj następującego Po prostu utwórz metodę,

-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}

Po prostu kliknij prawym przyciskiem myszy pole tekstowe w widoku i ustaw zdarzenie tak, jak zakończyło się przy wyjściu, i podłącz je do metody "dismissskeyboard".

Najlepszym przewodnikiem dla początkujących jest "Head First iPhone and iPad Development, 2nd Edition"

 0
Author: chandru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-13 19:18:58

Spróbuj tego

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
 0
Author: Vineesh TP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-31 13:52:16
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}
 0
Author: jake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-14 02:52:43

Ktoś szuka Swift 3

1) Upewnij się, że Twój Delegat Uitextfielda jest podłączony do Twojego kontrolera ViewController w Storyboardzie

2) zaimplementuj UITextFieldDelegate w kontrolerze ViewController.Plik Swift (np. Klasa ViewController: UIViewController, UITextFieldDelegate {)

3) użyj metody delegata poniżej

func textFieldShouldReturn(textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
return false }
 0
Author: Burf2000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-06 15:53:37

Tak w Swifcie 4.2 zwalniam klawiaturę i u mnie działa:

    override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: 
    #selector(dismissKeyboard))

    view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    numberField.resignFirstResponder()
    }
 0
Author: Prakhar Prakash Bhardwaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-22 08:52:11

Swift 3, Ios 9 +

@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}

UPD: to nadal działa dobrze dla mnie. Myślę, że facet, który poświęcił tę odpowiedź, po prostu nie rozumiał, że musi powiązać tę akcję z UITextField w storyboardzie.

 -2
Author: Artyom Devyatov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-12 19:49:21
textField.returnKeyType = UIReturnKeyDone;
 -6
Author: Gal Blank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-30 13:21:03