Hinweis:
Siehe akzeptierte Antwort (nicht die am besten gewählte) für die Lösung ab iOS 4.3.
Bei dieser Frage handelt es sich um ein Verhalten, das auf der iPad-Tastatur festgestellt wurde und nicht abgelehnt werden kann, wenn sie in einem modalen Dialog mit einem Navigationscontroller angezeigt wird.
Grundsätzlich, wenn ich dem Navigationscontroller die folgende Zeile wie folgt vorstelle:
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
Die Tastatur wird nicht entlassen. Wenn ich diese Zeile auskommentiere, geht die Tastatur gut weg.
...
Ich habe zwei Textfelder, Benutzername und Passwort. Der Benutzername hat eine Schaltfläche Weiter und das Passwort eine Schaltfläche Fertig. Die Tastatur verschwindet nicht, wenn ich dies in einem modalen Navigationscontroller präsentiere.
WERKE
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
[self.view addSubview:b.view];
FUNKTIONIERT NICHT
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
Wenn ich den Navigationscontroller-Teil entferne und 'b' als Modal View Controller selbst präsentiere, funktioniert es. Ist der Navigationscontroller das Problem?
WERKE
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];
WERKE
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
UINavigationController
Unterricht einzuteilen. Prost.resignFirstResponder
das ausgeführt wurde, aber die Tastatur immer noch angezeigt wurde. Mein Szenario (PresentationFormSheet mit Navigationssteuerung) ist genau das gleiche wie Ihres. Danke vielmals!!Antworten:
Überschreiben Sie
disablesAutomaticKeyboardDismissal
in dem modal dargestellten Ansichts-Controller einfach, um Folgendes zurückzugebenNO
:quelle
Dies wurde von Apple-Ingenieuren als "funktioniert wie beabsichtigt" eingestuft. Ich habe vor einiger Zeit einen Fehler dafür gemeldet. Ihre Argumentation ist, dass der Benutzer häufig Daten in modaler Form eingibt, um "hilfreich" zu sein und die Tastatur sichtbar zu halten, wo normalerweise verschiedene Übergänge in der modalen Ansicht dazu führen können, dass die Tastatur wiederholt angezeigt / ausgeblendet wird.
Bearbeiten: Hier ist die Antwort eines Apple-Ingenieurs in den Entwicklerforen:
Dies gibt vielen Menschen Probleme (ich selbst eingeschlossen), aber im Moment scheint es keine Möglichkeit zu geben, es zu umgehen.
AKTUALISIEREN:
In iOS 4.3 und höher können Sie jetzt `-disablesAutomaticKeyboardDismissal 'auf Ihrem View Controller implementieren, um NO:
Dies behebt das Problem.
quelle
UINavigationController
Unterklasse erstellen , die überschrieben wird,disablesAutomaticKeyboardDismissal
um sie zurückzugeben,NO
und diese als Navigationssteuerung verwenden, wenn Sie ein modales Formularblatt präsentieren. Siehe die Antwort von @ miha-hribar unten.Seien Sie vorsichtig, wenn Sie das Modal mit a anzeigen
UINavigationController
. Sie müssen dann diedisablesAutomaticKeyboardDismissal
am Navigationscontroller und nicht am Ansichtscontroller einstellen . Sie können dies leicht mit Kategorien tun.Datei: UINavigationController + KeyboardDismiss.h
Datei: UINavigationController + KeyboardDismiss.m
Vergessen Sie nicht, die Kategorie in die Datei zu importieren, in die Sie den UINavigationController verwenden.
quelle
disablesAutomaticKeyboardDismissal
vonUINavigationController
, nicht den eigenen View - Controller, um dieses Problem zu beheben.Ich habe dieses Problem gelöst, indem ich den
UIModalPresentationPageSheet
Präsentationsstil verwendet und die Größe sofort nach der Präsentation geändert habe. Wie so:quelle
Wenn Sie eine andere modale Anzeige umschalten, wird die Tastatur möglicherweise ausgeblendet. Es ist nicht schön und es animiert nicht nach unten, aber Sie können es dazu bringen, wegzugehen.
Es wäre großartig, wenn es eine Lösung gäbe, aber im Moment funktioniert dies. Sie können es in einer Kategorie einklemmen
UIViewController
und aufrufen, wenn die Tastatur weg sein soll:Seien Sie jedoch vorsichtig, wenn Sie viewDidAppear / viewDidDisappear anzeigen und alle diese Methoden aufgerufen werden. Wie ich schon sagte, es ist nicht schön, aber es funktioniert.
-Adam
quelle
Sie können dies auch in einer universellen App umgehen, indem Sie einfach die Redewendung überprüfen. Wenn es sich um ein iPad handelt, öffnen Sie die Tastatur nicht automatisch und lassen Sie den Benutzer auf das tippen, was er bearbeiten möchte.
Vielleicht nicht die schönste Lösung, aber es ist sehr einfach und benötigt keine ausgefallenen Hacks, die mit der nächsten großen iOS-Version brechen werden :)
quelle
Fügen Sie diesen Code in Ihre Ansicht ein. WillDisappear: Die Methode des aktuellen Controllers ist eine weitere Möglichkeit, dies zu beheben:
quelle
Ich fand das
disablesAutomaticKeyboardDismissal
und das Hinzufügen einerdisablesAutomaticKeyboardDismissal
Funktion funktionierte bei mir nichtUITextField
in einem modalen Dialog .Die Bildschirmtastatur würde einfach nicht verschwinden.
Meine Lösung war zu , alle Texteingabesteuerelemente in meinem Dialogfeld deaktivieren und die relevanten Steuerelemente einen Bruchteil einer Sekunde später wieder zu aktivieren.
Es scheint , als ob , wenn iOS , dass keiner der sieht
UITextField
Kontrollen aktiviert sind, dann ist es nicht loswerden der Tastatur erhalten.quelle
Ich bin sicher, Sie haben sich das angesehen, aber Sie sind sicher, dass Ihre Controller-Klasse ordnungsgemäß als UITextField-Delegat angeschlossen ist, oder?
quelle
Vielleicht nicht NEIN zurückgeben, sondern JA. So kann es weggehen.
Und Sie haben auch ein
textFieldShouldEndEditing
zurückkehrendes JA?Und warum feuerst duEntschuldigung, ich sehe jetzt[nextResponder becomeFirstResponder]
?!Dürfen wir annehmen, dass keiner von ihnen zufällig einen
tag
Wert von hatsecondField.tag+1
? Wenn ja, sagen Sie ihnen, sie sollen Ersthelfer werden, anstatt den Ersthelfer zurückzutreten. Vielleicht etwas NSLog () in diese if-Struktur einfügen.quelle
NSLog("tf %x / method ...",textField);
in alle Delegiertenfunktionen eine eingefügt?Informationen zu Problemen mit UINavigationController finden Sie in meiner Antwort auf eine ähnliche Frage hier: https://stackoverflow.com/a/10507689/321785
Bearbeiten: Ich betrachte dies als eine Verbesserung der Lösung von Miha Hribar (da die Entscheidung dort stattfindet, wo sie stattfinden sollte) und im Gegensatz zu Pascals Kommentar zu einer Kategorie in UIViewController
quelle
ist vielleicht keine perfekte Lösung, funktioniert aber
[self.view endEditing: YES];
von überall dort, wo Ihre Schaltfläche oder Geste implementiert ist, um Modal zu präsentieren
quelle
quelle