iOS - Tastatur schließen, wenn außerhalb von UITextField berührt wird

461

Ich frage mich, wie ich die Tastatur verschwinden lassen kann, wenn der Benutzer außerhalb von a berührt UITextField.

jonepatr
quelle
8
Dmitry hatte die richtige Antwort. Dies ist kein Gestenproblem - es ist ein Problem, den Ersthelfer zurückzutreten. Die Antwort von Dmirty ist auch die von Mark, Nutting und LeMarche empfohlene Lösung für den Beginn der iOS 4-Entwicklung , Kapitel 4, Seite 83.
jww

Antworten:

760

Sie müssen ein hinzufügen UITapGestureRecogniserund es der Ansicht zuweisen und dann den Rücktritts-Ersthelfer auf dem UITextFieldSelektor 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 aTextFieldist 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()
}
Jensen2k
quelle
6
Dies funktioniert, aber es deaktiviert oder macht die Schaltflächen der Navigationsleiste als nicht anklickbar. Gibt es dafür eine Lösung?
Parth Bhatt
137
Ich denke besser als es [aTextField resignFirstResponder]wäre, [self.view endEditing:YES];brauche ich keinen Verweis auf das Textfeld und werde für mehrere Textfelder funktionieren
Julian Król
90
Ohne irgendwelche Methoden definieren zu müssen, wäre ein [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
Einzeiler
8
@ParthBhatt Ich habe [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.
Tom Howard
7
Schneller Einzeiler: self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
Störung
176

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];
}
zeichneten
quelle
Fantastisch, es funktioniert auf UITableView !! es rettet meinen Tag! Als Randnotiz verwende ich [UITextField resignFirstResponder] anstelle von [UIView endEditing:], da ich mehr UITextField habe und endEditing eine falsche Bildlaufposition ergibt, selbst wenn das neue UITextField sichtbar ist.
Dr. Luiji
1
Absolut falsch, weil der UITapGestureRecognizer niemals zur Ansicht hinzugefügt wird!
1
Was ist der Zweck von cancelsTouchesInView hier?
Adam Johns
3
Wenn Sie hier nicht cancelsTouchesInView = false hinzufügen, können Sie keine anderen Elementtypen in Ihrer Ansicht auswählen. Ihre Taps werden vom gestureRecognizer abgefangen.
HalR
104

Ü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.

https://github.com/michaeltyson/TPKeyboardAvoiding

Prasad De Zoysa
quelle
@Ramesh ja, aber nicht auf diese Weise. Sie müssen eine Unterklasse aus UITableView erstellen und innerhalb dieser Klasse die touchBegan-Methode implementieren und dann die endEditing-Methode aufrufen. Es klappt! Vergessen Sie nicht, die Klasse für Ihre Tabelle in der Schreibfeder mit der neu erstellten Klasse festzulegen.
Prasad De Zoysa
3
Die Tastatur wird nicht ausgeblendet, wenn der Benutzer andere angezeigte Steuerelemente berührt. Beispiel: Ich habe einen UIButton und UITextField in UIView. Ich tippe auf UITextField und dann auf die Schaltfläche. Die Tastatur wird in diesem Fall nicht ausgeblendet.
Jacob Dam
2
@ JacobDam Du hast recht. Das Ziel ist es, den Firespesponder zurückzutreten, um die Tastatur auszublenden, wenn etwas außerhalb von aTextField passiert.
88

Ich sehe, dass einige Leute Probleme mit der UITapGestureRecognizerMethode 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 propertyhier (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.

Qiao Yi
quelle
3
Ich möchte auch hinzufügen, dass für diejenigen, die ein Hintergrundbild am Ende der Ansicht verwenden UIImageView, hinzufügen [imageView setUserInteractionEnabled:NO];und Sie es "durchklicken", wodurch diese Methode funktioniert.
Paul Peelen
55

Es ist besser, UIVieweine Instanz von UIControl(im Interface Builder) zu erstellen und dann deren TouchUpInsideEreignis mit der dismissKeyboardMethode zu verbinden. Diese IBActionMethode sieht folgendermaßen aus:

- (IBAction)dismissKeyboard:(id)sender {
    [aTextBox resignFirstResponder];
}
Dmitry Sitnikov
quelle
1
Vielen Dank! Dies funktionierte für mich und andere Lösungen nicht. ( UITapGestureRecognizerBeeinträchtigt das Tippen auf Schaltflächen in der Ansicht). touchesEndedhat nicht funktioniert, weil es ein UIScrollViewDurcheinander mit der Responderkette gab.)
jlstrecker
1
Dies funktioniert hervorragend, muss aber zu allem hinzugefügt werden, was Sie möchten, um die Tastatur zu schließen. Gibt es eine Möglichkeit, ein Textfeld automatisch als Ersthelfer zurücktreten zu lassen, wenn Sie auf etwas anderes tippen?
Isaac Overacker
4
Sie sollten UIView nicht zu einem UIControl machen müssen. Stellen Sie sicher, dass in UIView die Benutzerinteraktion aktiviert ist.
Sofi Software LLC
1
@SofiSoftwareLLC Dein Vorschlag hat bei mir nicht funktioniert. Ich musste es zu einem UIControl machen, auch wenn User Interaction Enabled aktiviert war.
Drei Tassen
1
Mit einem StoryBoard habe ich UIView in UIControl geändert (wo ich eine UIView-Unterklasse ausgewählt hätte, wenn ich eine erstellt hätte). Es funktioniert gut. Ich bin auf keine Probleme gestoßen. iOS8.
ToddB
30

Swift 4

Richten Sie Ihre UIViewControllermit 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
    }
}
FBente
quelle
2
Bro, du hast es geschafft !! Diese Antwort ist perfekt und funktioniert wirklich gut, vielen Dank.
Rost
28

Schnelle Version, dies funktioniert in Kombination mit anderen Elementen (wie dem einen UIButtonoder anderen UITextField):

override func viewDidLoad() {
    super.viewDidLoad()

    let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
    tapper.cancelsTouchesInView = false
    view.addGestureRecognizer(tapper)
}
rauben
quelle
1
Ziel sollte selfeher sein alsself.view
EI Captain v2.0
1
Ziel sollte self.view sein. Andernfalls stürzt der obige Code ab.
Naga Mallesh Maddali
canclesTouchesInViewist eine praktische Eigenschaft zu verwenden. Vielen Dank.
JonSlowCN
Alte Gewohnheiten sind schwer abzulegen. Was macht das Semikolon hier? ;)
Alexandre G.
@AlexandreG. In der Tat, zumal ich im Allgemeinen codiere c#. Zu Ihrer Information: Dieses Semikolon ist syntaxfähig, es ist einfach nicht notwendig.
Rob
17

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];
            }
        } 
    }
}
Herr H.
quelle
Ich habe nicht nach UITextField gesucht, daher funktioniert es für jeden Eingabetyp. Ich sehe kein Problem.
Frank
15

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

eduludi
quelle
12

Swift 4 Oneliner

view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
newDeveloper
quelle
Netter Code, aber dieser deaktiviert die Löschfunktion (-)
schellingerht
Du bist ein Genie!
Abhishek Bedi
10

Ich denke, der einfachste (und beste) Weg, dies zu tun, besteht darin, Ihre globale Ansicht zu unterordnen und die hitTest:withEventMethode 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, touchesBeganda sie touchesBegannicht aufgerufen werden, wenn Sie auf eine Schaltfläche oben in der Ansicht klicken. Es ist besser als UITapGestureRecognizerdas, 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.

Enzo Tran
quelle
Leider scheint dies das 'X' von UISearchBar zum Löschen von Text zu beeinträchtigen.
Huggie
1
Bei diesem Ansatz gibt es einige Probleme. Sie können beispielsweise keine Bildlaufansicht scrollen, ohne den Fokus auf Ihr Textfeld zu verlieren. Nicht empfehlenswert für komplexere Szenarien ... Ich persönlich bevorzuge die Uicontrol-Version von Dmitry, die möglicherweise durch den Kommentar von Sofi Software erweitert wird.
Katzenhut
Ein Beispiel für das Scrollen ist in der E-Mail-App. Wenn Sie in die Suchleiste tippen und dann durch die Mail-Liste scrollen, wird die Tastatur geschlossen.
Enzo Tran
Es ist der beste Ansatz und hatte meine anderen Projekte gemacht.
Chandramani
6

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.

Joe Masilotti
quelle
6

Sie können dies mit dem Storyboard in XCode 6 und höher tun:


Erstellen Sie die Aktion, um die Tastatur auszublenden

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):

Geben Sie hier die Bildbeschreibung ein


Verbinden Sie die Aktion mit dem Benutzerereignis

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:

Geben Sie hier die Bildbeschreibung ein

... und ändere seine Klasse:

Geben Sie hier die Bildbeschreibung ein

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:

Geben Sie hier die Bildbeschreibung ein

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.)

Chris Halcrow
quelle
Vielen Dank für die Lösung und ausführliche Erklärung. Wirklich hilfreich für mich.
Yongxiang Ruan
5

Wenn ich Sie richtig verstanden habe, möchten Sie auf die Tastatur verzichten, textfieldwährend Sie auf outSide of tippen, aber Sie haben keine Referenz von Ihrertextfield .

Versuche dies;

  • Nehmen Sie globales textField, nennen wir es reftextField
  • Jetzt im textFieldDidBeginEditingeingestellten 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;
    }
rptwsthi
quelle
3

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");
}
John Riselvato
quelle
3

Hier gibt es UITapGestureRecognizerviele gute Antworten zur Verwendung von - alle davon sind die UITextFieldClear (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.

skedastik
quelle
Genau, alle oben genannten Dinge schlagen fehl, wenn ich in das gleiche Textfeld tippe. Es tritt zurück, sogar das Textfeld ist mein Antwortender. und es schließt auch die Tastatur beim Tippen auf die Schaltfläche "Löschen" im Textfeld
Mrug
Ich würde es vereinfachen, indem ich nur den Test für die Schaltfläche durchführe : 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.
Marián Černý
3

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
Hiren
quelle
3

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:"))
Syed Asad Ali
quelle
2

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];
}
mtorre
quelle
2

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:)]];
Sudhin Davis
quelle
2
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch = touches.first{
     view.endEditing(true)

     }
}
Phani Sai
quelle
2

Ich habe viele der Antworten hier ausprobiert und hatte kein Glück. Mein Tippgestenerkenner hat immer dazu geführt, dass ich UIButtonsbeim 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 dismissKeyboardMethode 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 dismissKeyboardSelectorAusführung aus dem Touch-Handling-Ausführungsstapel herauszuholen ...

user1021430
quelle
1

Senden Sie eine Nachricht resignFirstResponderan die Textdatei, die sie dort abgelegt hat. Weitere Informationen finden Sie in diesem Beitrag .

Ke Sun.
quelle
1

Das funktioniert

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");
}

quelle
1
- (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];

}
Gaurav Gilani
quelle
1

Fügen Sie diesen Code in Ihre ViewController.m- Datei ein:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}
aashish tamsya
quelle
1

In diesem Fall kann ScrollView verwendet und TextFieldin ScrollView hinzugefügt werden. Ich möchte Tippen Sie auf ScrollViewund 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.

Geben Sie hier die Bildbeschreibung ein

Ravi Dhorajiya
quelle
1

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];

}
Nirzar Gandhi
quelle
1
  • 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;
    }
seggy
quelle