Einfache Möglichkeit, die Tastatur zu schließen?


377

Ich habe einige Steuerelemente in vielen Tabellenzellen in meiner Tabelle verteilt, und ich habe mich gefragt, ob es eine einfachere Möglichkeit gibt, die Tastatur zu schließen, ohne alle meine Steuerelemente durchlaufen und sie alle als Ersthelfer zurücktreten zu müssen. Ich denke die Frage ist .. Wie würde ich den aktuellen Ersthelfer auf die Tastatur bringen?


nette Ergänzung zu dieser Frage: stackoverflow.com/questions/1490573/…
ericsoco

Ein Vorbehalt zu allen unten stehenden Antworten. Wenn Sie unmittelbar nach dem Rücktritt von der KB einen Übergang durchführen, wird die KB verwaist und kann nicht entlassen werden. Sie müssen die KB in der textFieldShouldReturn-Methode schließen.
gjpc

26
globale Tastaturentlassung auf die richtige Weise:[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Yerk

Ich fand dieses Video hilfreich pinkstone.co.uk/… . Vielleicht kann es anderen helfen.
Enthusiastgeek

Antworten:


797

Versuchen:

[self.view endEditing:YES];

1
Dies scheint zu funktionieren (getestet auf ios4.1). Es ist jedoch nur ab iOS 3.2 verfügbar. Ich bin mir nicht sicher, ob dies tatsächlich garantiert funktioniert oder nur ein nicht garantierter Nebeneffekt ist, wenn eine API so aufgerufen wird, dass nicht dokumentiert ist, dass sie funktioniert.
JosephH

3
Dies hat bei mir perfekt funktioniert und ist sicherlich einigen anderen Antworten auf diese Frage vorzuziehen. Die Dokumente sagen, dass es in iOS 2.0 und höher verfügbar ist.
antsyawn

8
In der Dokumentation heißt es: "Diese Methode untersucht die aktuelle Ansicht und ihre Unteransichtshierarchie für das Textfeld, das derzeit der Ersthelfer ist. Wenn es eines findet, fordert es dieses Textfeld auf, als Ersthelfer zurückzutreten. Wenn der Parameter force festgelegt ist zu JA, das Textfeld wird nicht einmal gefragt; es muss zurücktreten. " - Dies ist also IMO die richtige Antwort auf die ursprüngliche Frage (Anwendungsfall: Ich habe ein Formular mit Millionen von Feldern, also zehn ... oder so, und ich muss die Tastatur schließen).
Joshis

14
Die Antwort ist nicht falsch, aber ein wenig falsch, eigentlich sollte es sein: [self.view endEditing:YES];Da die BOOL-Werte in Objective-C JA / NEIN sind.
Chrisben

24
chrisben: Sie können YES / NO, TRUE / FALSE, 0/1 verwenden.
Michael Superczynski

126

Sie können die aktuell bearbeitete Ansicht zwingen, ihren Ersthelferstatus mit aufzugeben [view endEditing:YES]. Dadurch wird die Tastatur ausgeblendet.

Im Gegensatz zu -[UIResponder resignFirstResponder], -[UIView endEditing:]wird durch Subviews suchen die aktuellen Ersthelfer zu finden. Sie können es also an Ihre Ansicht der obersten Ebene senden (z. B. self.viewin a UIViewController), und es wird das Richtige tun.

(Diese Antwort enthielt zuvor einige andere Lösungen, die ebenfalls funktionierten, aber komplizierter waren als erforderlich. Ich habe sie entfernt, um Verwirrung zu vermeiden.)


Dies verhindert jedoch nur, dass die Komponente zum FirstResponder wird, und entfernt nicht den aktuellen FirstResponder-Status aus einem Element.
Kendall Helmstetter Gelner

Was ich beim Überschreiben von comeFirstResponder meinte, um den Ersthelfer irgendwo zu speichern, damit später darauf zugegriffen werden kann (in diesem Fall zurückgetreten). Das Grundproblem besteht darin, dass Cocoa Touch keine Möglichkeit bietet, ein Fenster zu fragen oder anzuzeigen, was sein Ersthelfer ist.
Nicholas Riley

+1 Durch Hinzufügen von werdenFirstResponder wurden Probleme behoben, die ich beim Tippen auf andere UITextFields hatte.
Jason George

3
Das ist veraltet. Die [self.view endEditing:YES];Antwort ist besser.
ftvs

1
Dies ist nicht veraltet, diese Antwort erklärt genau, wie [UIView endediting:]funktioniert. In einer der von mir entwickelten Apps wurde in UINavigationViewController ein Suchfeld hinzugefügt. Wenn Sie nur [self.view endEditing:YES]als selfView Controller aufrufen , funktioniert dies nicht. Stattdessen habe ich diese Methode direkt im Ansichtsbereich aufgerufen, in dem das Suchfeld hinzugefügt wurde. Beispiel: [self.mySearchBoxView endEditing:YES].
Jan Cássio

92

Sie können keine gezielte Aktion an die Anwendung senden. Der Ersthelfer wird jederzeit zurückgetreten, ohne sich Gedanken darüber machen zu müssen, welche Ansicht derzeit den Ersthelferstatus hat.

Ziel c:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

Swift 3.0:

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)

Unter Mac OS X sind keine gezielten Aktionen für Menübefehle üblich, und hier ist eine Verwendung für sie unter iOS.


14
Beste Lösung der gesamten Seite.
Leo Natan

Absolut der beste Weg, um die Tastatur von überall in der iOS-App loszuwerden.
Ben Sinclair

Funktioniert immer noch für mich in iOS8. In meiner Anwendung habe ich ein Seitenleistenmenü, und manchmal zeigt der "Center" -Ansichts-Controller die Tastatur an. Und ich möchte die Tastatur schließen, wenn das Seitenleistenmenü angezeigt wird. Also habe ich diesen Code in die viewWillAppear-Methode von Class in meinem Seitenleistenmenü Class eingefügt.
Jenn Eve

1
Funktioniert immer noch in iOS 9. Eine großartige Möglichkeit, den Fokus eines Textfelds global aufzugeben und die Tastatur zu schließen.
Bmjohns

Und um diese besondere Kommentierungssträhne fortzusetzen .... Funktioniert immer noch in iOS 10. :-)
Travelling Man

56

Um ehrlich zu sein, bin ich nicht verrückt nach den hier vorgeschlagenen Lösungen. Ich habe einen guten Weg gefunden, einen TapGestureRecognizer zu verwenden, der meiner Meinung nach Ihr Problem auf den Punkt bringt: Wenn Sie auf etwas anderes als die Tastatur klicken, schließen Sie die Tastatur.

  1. Registrieren Sie sich in viewDidLoad, um Tastaturbenachrichtigungen zu erhalten, und erstellen Sie einen UITapGestureRecognizer:

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    
    [nc addObserver:self selector:@selector(keyboardWillShow:) name:
    UIKeyboardWillShowNotification object:nil];
    
    [nc addObserver:self selector:@selector(keyboardWillHide:) name:
    UIKeyboardWillHideNotification object:nil];
    
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
    action:@selector(didTapAnywhere:)];
  2. Fügen Sie die Tastatur hinzu, um Responder anzuzeigen / auszublenden. Dort fügen Sie den TapGestureRecognizer zur UIView hinzu und entfernen ihn, der die Tastatur beim Tippen schließen soll. Hinweis: Sie müssen es nicht allen Unteransichten oder Steuerelementen hinzufügen.

    -(void) keyboardWillShow:(NSNotification *) note {
        [self.view addGestureRecognizer:tapRecognizer];
    }
    
    -(void) keyboardWillHide:(NSNotification *) note
    {
        [self.view removeGestureRecognizer:tapRecognizer];
    }
  3. Der TapGestureRecognizer ruft Ihre Funktion auf, wenn er getippt wird, und Sie können die Tastatur folgendermaßen schließen:

    -(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {    
        [textField resignFirstResponder];
    }

Das Schöne an dieser Lösung ist, dass sie nur nach Taps filtert, nicht nach Swipes. Wenn Sie also einen Bildlaufinhalt über der Tastatur haben, wird durch Wischen immer noch gescrollt und die Tastatur angezeigt. Wenn Sie die Gestenerkennung entfernen, nachdem die Tastatur weg ist, werden zukünftige Tippen auf Ihre Ansicht normal behandelt.


Zu meiner @ Implementierung habe ich @property (zuweisen) UITapGestureRecognizer * tapRecognizer hinzugefügt; und geändert self.tapRecognizer = [[UITapGestureRecognizer-Zuweisung] initWithTarget: self action: @selector (didTapAnywhere :)];
Professor Todd

Ich versuche, etwas Ähnliches zu tun, und ich bekomme den Rückruf nicht vom Fass. Neugierig: Warum wird Ihre Immobilie "zugewiesen"?
TahoeWolverine

Plus eins, und außerdem sollte dies das Standardverhalten von iOS sein. Oder fügen Sie zumindest eine einfache Möglichkeit hinzu, um eine Entlassungsschaltfläche umzuschalten.
Shaunti Fondrisi

24

Dies ist eine Lösung, um die Tastatur zu entfernen, wenn sie returnin einem Textfeld gedrückt wird, indem Code an einer Stelle hinzugefügt wird (Sie müssen also nicht für jedes Textfeld einen Handler hinzufügen):


Betrachten Sie dieses Szenario:

Ich habe ein viewcontrollermit zwei Textfeldern (Benutzername und Passwort). und die viewcontrollerGeräteUITextFieldDelegate - Protokoll

Ich mache das in viewDidLoad

- (void)viewDidLoad 
{
    [super viewDidLoad];

    username.delegate = self;
    password.delegate = self;
}

und der Viewcontroller implementiert die optionale Methode als

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

und unabhängig von dem Textfeld, in dem Sie sich befinden return, wird es entlassen , sobald ich auf die Tastatur drücke !

In Ihrem Fall würde dasselbe funktionieren, solange Sie alle Delegaten des Textfelds auf self setzen und implementieren textFieldShouldReturn


Nun, ich habe das Problem bereits gelöst, aber in meinem Fall wollte ich die Tastatur alleine (im Code) schließen, und ich wusste nicht, welches textField den Ersthelferstatus hatte.
Seventoes

1
Es gibt Fälle, in denen Sie die Tastatur möglicherweise schließen möchten, ohne auf "Zurück" zu klicken, z. B. wenn ein Seitenleistenmenü angezeigt werden soll
Peter Johnson,

Bearbeitet, um zu verdeutlichen, dass diese Antwort nur in Situationen relevant ist, in denen das Drücken von "Zurück" eine akzeptable Lösung ist. [In meinem Fall wollte ich die Tastatur auch schließen, wenn der Benutzer außerhalb des zu bearbeitenden Felds tippt. Diese Antwort hilft dabei nicht.]
ToolmakerSteve

14

Ein besserer Ansatz ist es, den Status eines Ersthelfers zu "stehlen".

Da UIApplication eine Unterklasse von UIResponder ist, können Sie Folgendes versuchen:

[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]

Andernfalls erstellen Sie ein neues UITextField mit einem Rahmen mit der Größe Null, fügen Sie es irgendwo einer Ansicht hinzu und führen Sie etwas Ähnliches aus (gefolgt von Rücktritt).


1
Der UIApplication-Trick funktioniert nicht (er stürzt zumindest im Simulator ab), aber Sie benötigen kein UITextField mit der Größe Null - wählen Sie einfach ein zufälliges Feld aus und tun Sie dies damit. NSFesponders istFirstResponder ist eine reine Benachrichtigungsmethode, UIResponders jedoch nicht (das Design ist tatsächlich schlechter).
Nicholas Riley

1
Aha, danke! Es stürzt ab, wenn es bei UIApplication aufgerufen wird, aber das UITextField mit der Größe Null funktioniert hervorragend, und ich muss keines meiner vorherigen Felder abrufen.
Seventoes

Warum sollte jemand dies tun, wenn es dafür eine offizielle, vollkommen gute und dokumentierte Methode gibt?
Maciej Swic

2
Sie würden nicht die positivste Antwort für die bessere Lösung sehen. Es war damals einfach nicht bekannt (meine Antwort war von 2009, die andere Antwort kam mehr als ein Jahr später im Jahr 2010). aber ich überlasse es der Nachwelt.
Kendall Helmstetter Gelner

8

Verstauen Sie dies in einer Utility-Klasse.

+ (void)dismissKeyboard {
    [self globalResignFirstResponder];
}

+ (void) globalResignFirstResponder {
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    for (UIView * view in [window subviews]){
        [self globalResignFirstResponderRec:view];
    }
}

+ (void) globalResignFirstResponderRec:(UIView*) view {
    if ([view respondsToSelector:@selector(resignFirstResponder)]){
        [view resignFirstResponder];
    }
    for (UIView * subview in [view subviews]){
        [self globalResignFirstResponderRec:subview];
    }
}

1
das habe ich gesucht!
Aslisabanci

Perfekt, außer dass Sie die globalResignFirstResponderRec-Methode überhaupt nicht benötigen. Rufen Sie stattdessen einfach [view endEditing: YES] auf. Es macht das Gleiche.
n13

Ja! Das finale Resultat! Ich habe viele Möglichkeiten ausprobiert, nur diese funktioniert für mich! Vielen Dank!
Douyw

6

@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy:

Absolut brilliant!

Vielen Dank.

In Anbetracht Ihres Ratschlags und des Ratschlags anderer in diesem Thread habe ich Folgendes getan:

Wie es aussieht, wenn es verwendet wird:

[[self appDelegate] dismissKeyboard]; (Hinweis: Ich habe appDelegate als Ergänzung zu NSObject hinzugefügt, damit ich es überall für alles verwenden kann.)

Wie es unter der Haube aussieht:

- (void)dismissKeyboard 
{
    UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
    tempTextField.enabled = NO;
    [myRootViewController.view addSubview:tempTextField];
    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
}

BEARBEITEN

Änderung zu meiner Antwort enthalten tempTextField.enabled = NO;. Das Textfeld deaktivieren verhindert UIKeyboardWillShowNotificationund UIKeyboardWillHideNotificationTastatur - Benachrichtigungen von sollten Sie auf diese Benachrichtigungen in Ihrer App verlassen gesendet werden.


Ich weiß nicht, ob es funktioniert, aber es scheint ein kluger und einfacher Weg zu sein.
Dämon

5

Kurztipp zum Schließen der Tastatur in iOS, wenn ein Benutzer eine beliebige Stelle auf dem Bildschirm außerhalb von UITextField oder Tastatur berührt. In Anbetracht dessen, wie viel Platz die iOS-Tastatur beanspruchen kann, ist es sinnvoll, dass Ihre Benutzer die Tastatur auf einfache und intuitive Weise schließen können.

Hier ist ein Link


Großartig! Durch Hinzufügen zu AppDelegate funktioniert es für ALLE verwandten Ansichten.
Jiulong Zhao

5

Viele zu komplizierte Antworten hier, vielleicht weil dies in der iOS-Dokumentation nicht leicht zu finden ist. JosephH hatte es direkt oben:

[[view window] endEditing:YES];

4

Noch einfacher als Meagars Antwort

überschreiben touchesBegan:withEvent:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [textField resignFirstResponder];`
}

Dies wird, dismiss the keyboardwenn Sie irgendwo in der berühren background.


3

Folgendes verwende ich in meinem Code. Es wirkt wie ein Zauber!

Fügen Sie in yourviewcontroller.h Folgendes hinzu:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Fügen Sie dies nun in der .m-Datei Ihrer ViewDidLoad-Funktion hinzu:

- (void)viewDidLoad {
    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

Fügen Sie diese Funktion auch in die .m-Datei ein:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}

Vielen Dank! Aber Sie sollten die Funktion in 'didTapAnywhere' oder die Gestenerkennung in 'handleSingleTap' umbenennen ;-)
Matthijs

2

<UITextFieldDelegate>Fügen Sie in der Header-Datei Ihres View-Controllers die Definition der Schnittstelle Ihres Controllers hinzu, damit sie dem UITextField-Delegatenprotokoll entspricht ...

@interface someViewController : UIViewController <UITextFieldDelegate>

... Fügen Sie in der Implementierungsdatei des Controllers (.m) die folgende Methode oder den darin enthaltenen Code hinzu, wenn Sie bereits eine viewDidLoad-Methode haben ...

- (void)viewDidLoad
{
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTextBox.delegate = self;
}

... Verknüpfen Sie dann Ihre Textbox mit Ihrem eigentlichen Textfeld

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
{
    if (theTextField == yourTextBox) {
        [theTextField resignFirstResponder];
    }
    return YES;
}

2

Sie sollten endEditing:an das Arbeitsfenster senden , das die Unterklasse von istUIView

[[UIApplication sharedApplication].windows.firstObject endEditing:NO];

Ich wette, Sie meinten stattdessen JA)
Matrosov Alexander

2

Der beste Weg, um die Tastatur aus UITableView und UIScrollView zu entfernen, sind:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

2

In Swift 3 können Sie Folgendes tun

UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)

1

Jeremys Antwort funktionierte für mich nicht ganz, glaube ich, weil ich einen Navigationsstapel in einer Registerkartenansicht mit einem modalen Dialog darüber hatte. Ich verwende gerade Folgendes und es funktioniert für mich, aber Ihr Kilometerstand kann variieren.

 // dismiss keyboard (mostly macro)
[[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord

// --- dismiss keyboard (in indexAppDelegate.h) (mostly macro)
- (void)dismissKeyboard;

// --- dismiss keyboard (in indexAppDelegate.m) (mostly macro)
// do this from anywhere to dismiss the keybard
- (void)dismissKeyboard {    // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard

    UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero];

    UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called.  Probably is a way to determine this progragrammatically)
    UIViewController *uivc;
    if (myRootViewController.navigationController != nil) { // for when there is a nav stack
        uivc = myRootViewController.navigationController;
    } else {
        uivc = myRootViewController;
    }

    if (uivc.modalViewController != nil) { // for when there is something modal
        uivc = uivc.modalViewController;
    } 

    [uivc.view  addSubview:tempTextField];

    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
    [tempTextField release];

}

Hmm - warum die Abstimmung? Ich habe in einer anderen Antwort mit getestetem Code bestimmte reale Mängel angesprochen. Ich kann einen Mangel an Stimmen verstehen, aber mich in ein negatives Gebiet zu wählen, ist eine echte Entmutigung. Ich hoffe immer noch, dass die obige Antwort jemand anderem hilft.
JJ Rohrer

1

Möglicherweise müssen Sie auch UIViewController disablesAutomaticKeyboardDismissal überschreiben, damit dies in einigen Fällen funktioniert. Dies muss möglicherweise auf dem UINavigationController durchgeführt werden, falls Sie einen haben.


1

Unterklassen Sie Ihre Textfelder ... und auch Textansichten

In die Unterklasse geben Sie diesen Code ein ..

-(void)conformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}

-(void)deConformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self resignFirstResponder];
}

In den Textfelddelegierten (ähnlich für Textansichtsdelegierte)

-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
     [textField conformsToKeyboardDismissNotification];
}


- (void)textFieldDidEndEditing:(JCPTextField *)textField{
    [textField deConformsToKeyboardDismissNotification];
}

Alles klar. Veröffentlichen Sie jetzt einfach die Benachrichtigung von einer beliebigen Stelle in Ihrem Code. Es wird jede Tastatur zurücktreten.


1

Und schnell können wir es tun

UIApplication.sharedApplication().sendAction("resignFirstResponder", to: nil, from: nil, forEvent: nil)

Ich verstehe nicht, wie der Ersthelfer funktioniert. Wo soll ich das hinstellen? aus meiner Sicht Controller oder Delegierter?
Shayan C

Ist egal. Sie können es platzieren, wo immer Sie wollen. dh
Eike

1

Um eine Tastatur zu schließen, nachdem die Tastatur aufgetaucht ist, gibt es zwei Fälle :

  1. wenn sich das UITextField in einer UIScrollView befindet

  2. wenn sich das UITextField außerhalb einer UIScrollView befindet

2.Wenn sich das UITextField außerhalb einer UIScrollView befindet, überschreiben Sie die Methode in Ihrer UIViewController-Unterklasse

Sie müssen auch einen Delegaten für alle UITextView hinzufügen

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. In einer Bildlaufansicht wird durch Tippen auf Außen kein Ereignis ausgelöst . Verwenden Sie in diesem Fall einen Tap- Gestenerkenner. Ziehen Sie eine UITapGesture für die Bildlaufansicht per Drag & Drop und erstellen Sie eine IBAction dafür .

Um eine IBAction zu erstellen, drücken Sie Strg + klicken Sie auf die UITapGesture und ziehen Sie sie in die .h-Datei von viewcontroller.

Hier habe ich tappedEvent als meinen Aktionsnamen benannt

- (IBAction)tappedEvent:(id)sender {
      [self.view endEditing:YES];  }

Die oben angegebenen Informationen wurden über den folgenden Link abgeleitet. Weitere Informationen erhalten Sie oder kontaktieren Sie mich, wenn Sie die oben angegebenen Daten nicht verstehen.

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/


0

Ich hasse es, dass es keine "globale" Möglichkeit gibt, die Tastatur programmgesteuert zu schließen, ohne private API-Aufrufe zu verwenden. Häufig muss ich die Tastatur programmgesteuert schließen, ohne zu wissen, welches Objekt der Ersthelfer ist. Ich habe versucht, die selfmithilfe der Objective-C-Laufzeit-API zu überprüfen, alle Eigenschaften aufzulisten, die vom Typ zu UITextFieldentfernen und ihnen die resignFirstResponderNachricht zu senden .

Es sollte nicht so schwer sein, das zu tun ...


0

Es ist nicht schön, aber wie ich den ersten Antwortgeber zurücktrete, wenn ich nicht weiß, was der Antwortende ist:

Erstellen Sie ein UITextField, entweder in IB oder programmgesteuert. Mach es versteckt. Verknüpfen Sie es mit Ihrem Code, wenn Sie es in IB gemacht haben. Wenn Sie dann die Tastatur schließen möchten, schalten Sie den Responder in das unsichtbare Textfeld und geben es sofort auf:

  [self.invisibleField becomeFirstResponder];
  [self.invisibleField resignFirstResponder];

0

Sie können Unteransichten rekursiv durchlaufen, ein Array aller UITextFields speichern, diese dann durchlaufen und alle zurücktreten.

Keine wirklich gute Lösung, besonders wenn Sie viele Unteransichten haben, aber für einfache Apps sollte es den Trick tun.

Ich habe dies auf eine viel kompliziertere, aber viel performantere Weise gelöst, aber mit einem Singleton / Manager für die Animations-Engine meiner App, und jedes Mal, wenn ein Textfeld zum Antwortenden wurde, habe ich es einer statischen Zuweisung zugewiesen, die erhalten würde aufgrund bestimmter anderer Ereignisse aufgeräumt (zurückgetreten) ... es ist mir fast unmöglich, dies in einem Absatz zu erklären.

Seien Sie kreativ, ich habe nur 10 Minuten gebraucht, um dies für meine App zu überdenken, nachdem ich diese Frage gefunden habe.


Vor Monaten gelöst;) Am Ende habe ich nur das aktive Feld im Fokus gespeichert und das verwendet.
Seventoes

0

Eine etwas robustere Methode, die ich kürzlich verwenden musste:

- (void) dismissKeyboard {
    NSArray *windows = [UIApplication sharedApplication].windows;

    for(UIWindow *window in windows) [window endEditing:true];

    //  Or if you're only working with one UIWindow:

    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

Ich fand, dass einige der anderen "globalen" Methoden nicht funktionierten (zum Beispiel UIWebView& WKWebViewweigerte sich, zurückzutreten).


0

Fügen Sie Ihrer Ansicht einen Tap Gesture Recognizer hinzu. Definieren Sie ihn als Aktion

Ihre .m-Datei wird wie folgt sein

    - (IBAction)hideKeyboardGesture:(id)sender {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *window in windows) [window endEditing:true];
    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

Es hat bei mir funktioniert


0

Ja, endEditing ist die beste Option. Und ab iOW 7.0 UIScrollViewgibt es eine coole Funktion, um die Tastatur bei der Interaktion mit der Bildlaufansicht zu schließen. Um dies zu erreichen, können Sie die keyboardDismissModeEigenschaft von festlegenUIScrollView .

Stellen Sie den Tastaturentlassungsmodus wie folgt ein:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

Es gibt nur wenige andere Typen. Schauen Sie sich dieses Apfeldokument an .



0

Der einfachste Weg ist, die Methode aufzurufen

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    if(![txtfld resignFirstResponder])
    {
        [txtfld resignFirstResponder];
    }
    else
    {

    }
    [super touchesBegan:touches withEvent:event];
}

Sie brauchen dort kein 'Wenn', resignFirstResponder erledigt das sowieso. Vielleicht meinten Sie - (BOOL) canResignFirstResponder?
Siebziger

0

Sie müssen eine dieser Methoden anwenden:

[self.view endEditing:YES];

oder

[self.textField resignFirstResponder];
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.