Ich frage mich, wie ich die Tastatur verschwinden lassen kann, wenn der Benutzer außerhalb von a berührt UITextField
.
Ich frage mich, wie ich die Tastatur verschwinden lassen kann, wenn der Benutzer außerhalb von a berührt UITextField
.
Antworten:
Sie müssen ein hinzufügen UITapGestureRecogniser
und es der Ansicht zuweisen und dann den Rücktritts-Ersthelfer auf dem UITextField
Selektor anrufen .
Der Code:
In viewDidLoad
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
In entlassenKeyboard:
-(void)dismissKeyboard
{
[aTextField resignFirstResponder];
}
(Wo aTextField
ist das Textfeld, das für die Tastatur verantwortlich ist?)
Swift 3 Version sieht so aus
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))
self.view.addGestureRecognizer(tapGesture)
Für entlassenKeyboard
func dismissKeyboard (_ sender: UITapGestureRecognizer) {
aTextField.resignFirstResponder()
}
[aTextField resignFirstResponder]
wäre, [self.view endEditing:YES];
brauche ich keinen Verweis auf das Textfeld und werde für mehrere Textfelder funktionieren
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[tap setCancelsTouchesInView:NO];
per @qiaoyis Antwort hinzugefügt ; Ich hatte ein Problem mit einer Tabelle, die nicht auf die Zeilenauswahl reagierte. 5 Jahre später hoffe ich, dass dies jemand anderem hilft.
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
Ich habe ein paar Antworten zusammengestellt.
Verwenden Sie einen Ivar, der während initialisiert wird viewDidLoad:
UIGestureRecognizer *tapper;
- (void)viewDidLoad
{
[super viewDidLoad];
tapper = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSingleTap:)];
tapper.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapper];
}
Verwerfen Sie, was gerade bearbeitet wird:
- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
[self.view endEditing:YES];
}
Überprüfen Sie dies, dies wäre der einfachste Weg, dies zu tun.
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];// this will do the trick
}
Oder
Diese Bibliothek übernimmt das automatische Scrollen in der Bildlaufleiste, das Tippen auf eine Leertaste, um die Tastatur auszublenden usw.
Ich sehe, dass einige Leute Probleme mit der UITapGestureRecognizer
Methode haben. Der einfachste Weg, diese Funktionalität zu erreichen, während das Tippverhalten meiner vorhandenen Schaltfläche erhalten bleibt, besteht darin, der Antwort von @ Jensen2k nur eine Zeile hinzuzufügen:
[tap setCancelsTouchesInView:NO];
Dadurch konnten meine vorhandenen Schaltflächen weiterhin ohne die Methode von @Dmitry Sitnikov verwendet werden.
Lesen Sie dazu property
hier (suchen Sie nach CancelsTouchesInView
): UIGestureRecognizer Class Reference
Ich bin mir nicht sicher, wie es mit Bildlaufleisten funktionieren würde, da ich sehe, dass einige Probleme damit hatten, aber hoffentlich könnte jemand anderes auf dasselbe Szenario stoßen, das ich hatte.
UIImageView
, hinzufügen [imageView setUserInteractionEnabled:NO];
und Sie es "durchklicken", wodurch diese Methode funktioniert.
Es ist besser, UIView
eine Instanz von UIControl
(im Interface Builder) zu erstellen und dann deren TouchUpInside
Ereignis mit der dismissKeyboard
Methode zu verbinden. Diese IBAction
Methode sieht folgendermaßen aus:
- (IBAction)dismissKeyboard:(id)sender {
[aTextBox resignFirstResponder];
}
UITapGestureRecognizer
Beeinträchtigt das Tippen auf Schaltflächen in der Ansicht). touchesEnded
hat nicht funktioniert, weil es ein UIScrollView
Durcheinander mit der Responderkette gab.)
Swift 4
Richten Sie Ihre UIViewController
mit dieser Erweiterung Methode einmal zB in viewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
self.setupHideKeyboardOnTap()
}
und die Tastatur wird auch durch Tippen auf die Tastatur geschlossen NavigationBar
.
import UIKit
extension UIViewController {
/// Call this once to dismiss open keyboards by tapping anywhere in the view controller
func setupHideKeyboardOnTap() {
self.view.addGestureRecognizer(self.endEditingRecognizer())
self.navigationController?.navigationBar.addGestureRecognizer(self.endEditingRecognizer())
}
/// Dismisses the keyboard from self.view
private func endEditingRecognizer() -> UIGestureRecognizer {
let tap = UITapGestureRecognizer(target: self.view, action: #selector(self.view.endEditing(_:)))
tap.cancelsTouchesInView = false
return tap
}
}
Schnelle Version, dies funktioniert in Kombination mit anderen Elementen (wie dem einen UIButton
oder anderen UITextField
):
override func viewDidLoad() {
super.viewDidLoad()
let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
tapper.cancelsTouchesInView = false
view.addGestureRecognizer(tapper)
}
self
eher sein alsself.view
canclesTouchesInView
ist eine praktische Eigenschaft zu verwenden. Vielen Dank.
c#
. Zu Ihrer Information: Dieses Semikolon ist syntaxfähig, es ist einfach nicht notwendig.
Wie wäre es damit: Ich weiß, dass dies ein alter Beitrag ist. Es könnte jemandem helfen :)
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSArray *subviews = [self.view subviews];
for (id objects in subviews) {
if ([objects isKindOfClass:[UITextField class]]) {
UITextField *theTextField = objects;
if ([objects isFirstResponder]) {
[theTextField resignFirstResponder];
}
}
}
}
Dies ist eine gute generische Lösung:
Ziel c:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
Schnell:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
Basierend auf der @ icodebuster-Lösung: https://stackoverflow.com/a/18756253/417652
Swift 4 Oneliner
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
Ich denke, der einfachste (und beste) Weg, dies zu tun, besteht darin, Ihre globale Ansicht zu unterordnen und die hitTest:withEvent
Methode zu verwenden, um jede Berührung anzuhören. Berührungen auf der Tastatur sind nicht registriert, daher wird hitTest: withEvent nur aufgerufen, wenn Sie irgendwo anders berühren / scrollen / wischen / kneifen ... und dann anrufen [self endEditing:YES]
.
Dies ist besser als die Verwendung, touchesBegan
da sie touchesBegan
nicht aufgerufen werden, wenn Sie auf eine Schaltfläche oben in der Ansicht klicken. Es ist besser als UITapGestureRecognizer
das, was zum Beispiel eine Bildlaufgeste nicht erkennen kann. Es ist auch besser als die Verwendung eines dunklen Bildschirms, da Sie in einer komplexen und dynamischen Benutzeroberfläche nicht überall einen dunklen Bildschirm platzieren können. Darüber hinaus werden andere Aktionen nicht blockiert. Sie müssen nicht zweimal auf tippen, um eine Schaltfläche außerhalb auszuwählen (wie im Fall von aUIPopover
).
Es ist auch besser als anzurufen [textField resignFirstResponder]
, da möglicherweise viele Textfelder auf dem Bildschirm angezeigt werden, sodass dies für alle funktioniert.
Dies muss der einfachste Weg sein, Ihre Tastatur durch Berühren der Außenseite auszublenden:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
Wenn die Ansicht überhaupt in a eingebettet ist UIScrollView
, können Sie Folgendes verwenden:
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
Ersteres animiert die Tastatur außerhalb des Bildschirms, wenn die Tabellenansicht gescrollt wird, und letzteres versteckt die Tastatur wie die Standardnachrichten-App.
Beachten Sie, dass diese unter iOS 7.0 oder höher verfügbar sind.
Sie können dies mit dem Storyboard in XCode 6 und höher tun:
Fügen Sie dies der Header-Datei der von Ihrem ViewController verwendeten Klasse hinzu:
@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>
- (IBAction)dissmissKeyboardOnTap:(id)sender;
@end
Fügen Sie dies dann der Implementierungsdatei desselben ViewControllers hinzu:
- (IBAction)dissmissKeyboardOnTap:(id)sender{
[[self view]endEditing:YES];
}
Dies ist nun eine der "empfangenen Aktionen" für Ihre Storyboard-Szene (dh ViewController):
Jetzt müssen Sie diese Aktion mit der Benutzergeste zum Berühren der Tastatur verbinden.
Wichtig - Sie müssen das in Ihrem Storyboard enthaltene "UIView" in ein UIControl konvertieren , damit es Ereignisse empfangen kann. Wählen Sie die Ansicht aus Ihrer View Controller-Szenenhierarchie aus:
... und ändere seine Klasse:
Ziehen Sie nun aus dem kleinen Kreis neben der "empfangenen Aktion" für Ihre Szene auf einen "leeren" Teil Ihrer Szene (tatsächlich ziehen Sie die "empfangene Aktion" auf das UIControl). Es wird eine Auswahl von Ereignissen angezeigt, an die Sie Ihre Aktion anschließen können:
Wählen Sie die Option "Innen nachbessern". Sie haben jetzt die von Ihnen erstellte IBAction mit einer Benutzeraktion zum Berühren der Tastatur verknüpft. Wenn der Benutzer auf die Tastatur tippt, wird sie jetzt ausgeblendet.
(HINWEIS: Um die Aktion mit dem Ereignis zu verknüpfen, können Sie die empfangene Aktion auch direkt auf das UIControl in Ihrer View Controller-Hierarchie ziehen. Sie wird in der Hierarchie als 'Control' angezeigt.)
Wenn ich Sie richtig verstanden habe, möchten Sie auf die Tastatur verzichten, textfield
während Sie auf outSide of tippen, aber Sie haben keine Referenz von Ihrertextfield
.
Versuche dies;
reftextField
Jetzt im textFieldDidBeginEditing
eingestellten Textfeld auf setzen
- (void) textFieldDidBeginEditing:(UITextField *)textField{
reftextField = textField;
}
Jetzt können Sie jede Tastenuhr problemlos verwenden (Hinzufügen einer transparenten Schaltfläche, wenn Sie mit der Bearbeitung beginnen, wird empfohlen).
- (void)dismissKeyboard {
[reftextField resignFirstResponder];
}
Oder versuchen Sie dies, um die Schaltfläche "Fertig" zu beenden.
//for resigning on done button
- (BOOL) textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
Nur um der Liste hier meine Version hinzuzufügen, wie man eine Tastatur bei Berührung von außen schließt.
viewDidLoad:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];
Irgendwo:
-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
[textFieldName resignFirstResponder];
puts("Dismissed the keyboard");
}
Hier gibt es UITapGestureRecognizer
viele gute Antworten zur Verwendung von - alle davon sind die UITextField
Clear (X) -Taste von break . Die Lösung besteht darin, den Gestenerkenner über seinen Delegaten zu unterdrücken:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
BOOL touchViewIsButton = [touch.view isKindOfClass:[UIButton class]];
BOOL touchSuperviewIsTextField = [[touch.view superview] isKindOfClass:[UITextField class]];
return !(touchViewIsButton && touchSuperviewIsTextField);
}
Es ist nicht die robusteste Lösung, aber es funktioniert für mich.
return !touchViewIsButton
. Ich denke, alle anderen Tasten, die die Tastatur schließen müssen, sollten dies in ihren Aktionen tun. Außerdem wird TouchUpInside möglicherweise nicht aufgerufen, wenn sich das Layout beim Entlassen der Tastatur ändert.
Sie können eine Kategorie für das UiView erstellen und das touchBegan-Meathod wie folgt überschreiben.
Es funktioniert gut für mich. Und es ist eine zentrale Lösung für dieses Problem.
#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.window endEditing:true];
[super touchesBegan:touches withEvent:event];
}
@end
Schnelle Version der Antwort von @ Jensen2k:
let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(gestureRecognizer)
func dismissKeyboard() {
aTextField.resignFirstResponder()
}
Einzeiler
self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))
Ich habe Barry Beispiel für meine neue Entwicklung verwendet. Es hat super funktioniert! aber ich musste eine kleine Änderung hinzufügen, die erforderlich war, um die Tastatur nur für das zu bearbeitende Textfeld zu schließen.
Also habe ich dem Barry-Beispiel Folgendes hinzugefügt:
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
_textBeingEdited = textField;
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{
_textBeingEdited = nil;
}
Außerdem habe ich die hideKeyboard-Methode wie folgt geändert:
- (IBAction)hideKeyboard:(id)sender
{
// Just call resignFirstResponder on all UITextFields and UITextViews in this VC
// Why? Because it works and checking which one was last active gets messy.
//UITextField * tf = (UITextField *) sender;
[_textBeingEdited resignFirstResponder];
}
Eine der einfachsten und kürzesten Möglichkeiten besteht darin, diesen Code zu Ihrem Code hinzuzufügen viewDidLoad
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self.view
action:@selector(endEditing:)]];
Ich habe viele der Antworten hier ausprobiert und hatte kein Glück. Mein Tippgestenerkenner hat immer dazu geführt, dass ich UIButtons
beim Tippen nicht reagiert habe, selbst wenn ich den eingestellt habecancelsTouchesInView
Eigenschaft des Gestenerkenners auf NEIN gesetzt habe.
Dies ist, was schließlich das Problem gelöst hat:
Habe einen Ivar:
UITapGestureRecognizer *_keyboardDismissGestureRecognizer;
Wenn ein Textfeld bearbeitet wird, stellen Sie die Gestenerkennung ein:
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
if(_keyboardDismissGestureRecognizer == nil)
{
_keyboardDismissGestureRecognizer = [[[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissKeyboard)] autorelease];
_keyboardDismissGestureRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:_keyboardDismissGestureRecognizer];
}
}
Dann liegt der Trick darin, wie Sie die dismissKeyboard
Methode einrichten :
- (void) dismissKeyboard
{
[self performSelector:@selector(dismissKeyboardSelector) withObject:nil afterDelay:0.01];
}
- (void) dismissKeyboardSelector
{
[self.view endEditing:YES];
[self.view removeGestureRecognizer:_keyboardDismissGestureRecognizer];
_keyboardDismissGestureRecognizer = nil;
}
Ich denke, es geht nur darum, die dismissKeyboardSelector
Ausführung aus dem Touch-Handling-Ausführungsstapel herauszuholen ...
Senden Sie eine Nachricht resignFirstResponder
an die Textdatei, die sie dort abgelegt hat. Weitere Informationen finden Sie in diesem Beitrag .
In diesem Beispiel ist aTextField das einzige UITextField .... Wenn es andere oder UITextViews gibt, gibt es ein kleines bisschen mehr zu tun.
// YourViewController.h
// ...
@interface YourViewController : UIViewController /* some subclass of UIViewController */ <UITextFieldDelegate> // <-- add this protocol
// ...
@end
// YourViewController.m
@interface YourViewController ()
@property (nonatomic, strong, readonly) UITapGestureRecognizer *singleTapRecognizer;
@end
// ...
@implementation
@synthesize singleTapRecognizer = _singleTapRecognizer;
// ...
- (void)viewDidLoad
{
[super viewDidLoad];
// your other init code here
[self.view addGestureRecognizer:self.singleTapRecognizer];
{
- (UITapGestureRecognizer *)singleTapRecognizer
{
if (nil == _singleTapRecognizer) {
_singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapToDismissKeyboard:)];
_singleTapRecognizer.cancelsTouchesInView = NO; // absolutely required, otherwise "tap" eats events.
}
return _singleTapRecognizer;
}
// Something inside this VC's view was tapped (except the navbar/toolbar)
- (void)singleTapToDismissKeyboard:(UITapGestureRecognizer *)sender
{
NSLog(@"singleTap");
[self hideKeyboard:sender];
}
// When the "Return" key is pressed on the on-screen keyboard, hide the keyboard.
// for protocol UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
NSLog(@"Return pressed");
[self hideKeyboard:textField];
return YES;
}
- (IBAction)hideKeyboard:(id)sender
{
// Just call resignFirstResponder on all UITextFields and UITextViews in this VC
// Why? Because it works and checking which one was last active gets messy.
[aTextField resignFirstResponder];
NSLog(@"keyboard hidden");
}
- (void)viewDidLoad
{
[super viewDidLoad];
UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleSingleTap:)];
[singleTapGestureRecognizer setNumberOfTapsRequired:1];
[singleTapGestureRecognizer requireGestureRecognizerToFail:singleTapGestureRecognizer];
[self.view addGestureRecognizer:singleTapGestureRecognizer];
}
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
[self.view endEditing:YES];
[textField resignFirstResponder];
[scrollView setContentOffset:CGPointMake(0, -40) animated:YES];
}
Fügen Sie diesen Code in Ihre ViewController.m- Datei ein:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
In diesem Fall kann ScrollView verwendet und TextField
in ScrollView hinzugefügt werden. Ich möchte Tippen Sie auf ScrollView
und Anzeigen und dann auf Tastatur. Ich habe versucht, für alle Fälle Beispielcode zu erstellen. So was,
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.tap(_:)))
view.addGestureRecognizer(tapGesture)
// Do any additional setup after loading the view, typically from a nib.
}
func tap(gesture: UITapGestureRecognizer) {
textField.resignFirstResponder()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Ihr Storyboard Sehen Sie sich das genau so an.
Sie können die UITapGestureRecongnizer-Methode zum Schließen der Tastatur verwenden, indem Sie außerhalb von UITextField klicken. Wenn Sie diese Methode verwenden, wird die Tastatur geschlossen, wenn der Benutzer außerhalb von UITextField klickt. Unten finden Sie das Code-Snippet für die Verwendung.
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissk)];
[self.view addGestureRecognizer:tap];
//Method
- (void) dismissk
{
[abctextfield resignFirstResponder];
[deftextfield resignFirstResponder];
}
Festgelegte Textfelder, die in der Ansicht delegiert wurden, wurden geladen:
override func viewDidLoad()
{
super.viewDidLoad()
self.userText.delegate = self
}
Fügen Sie diese Funktion hinzu:
func textFieldShouldReturn(userText: UITextField!) -> Bool
{
userText.resignFirstResponder()
return true;
}