it-swarm.com.de

Wie kann man die Tastatur bei Berührung außerhalb von UITextField (in Swift) schließen

Ich arbeite an einem Projekt, das über einen UIViewController verfügt. Auf dem View-Controller befinden sich ein UIScrollView und ein UITextField in der Bildlaufansicht . Wie folgt: Ich versuche die Tastatur zu schließen und sie auszublenden, nachdem Sie Text in das Textfeld eingegeben haben, und tippen Sie auf eine beliebige Stelle außerhalb des Textfelds. Ich habe den folgenden Code ausprobiert:

override func viewDidLoad() {
    super.viewDidLoad()
    self.textField.delegate = self;
}

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

Es funktioniert für mich, wenn ich außerhalb der Bildlaufansicht tippe. Wenn ich jedoch auf die Bildlaufansicht tippe, geschieht nichts und die Tastatur wird nicht ausgeblendet.

Gibt es eine Möglichkeit, die Tastatur zu schließen, wenn Sie außerhalb des Textfelds auf irgendwo tippen? Vielen Dank

53
White Hat

Für Swift 4 bearbeitet

Bearbeiten: @objc hinzugefügt. Obwohl dies nicht die beste Option für die Leistung ist, sollte eine Instanz davon hier nicht zu viele Probleme verursachen, bis es eine bessere Lösung gibt.

Zum Beheben korrigiert, wenn mit Elementen hinter GestureRecognizer interagiert werden muss.

Edit: Danke @Rao für den Hinweis. tap.cancelsTouchesInView = false hinzugefügt.

Dies sollte Ihnen helfen, mehrere UITextView oder UITextField zu haben.

Erstellen Sie eine Erweiterung des View-Controllers. Dies hat für mich viel reibungsloser funktioniert und mit weniger Aufwand als bei der Verwendung von .resignFirstResponder().

extension UIViewController
{
    func hideKeyboard()
    {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(
            target: self,
            action: #selector(UIViewController.dismissKeyboard))

        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard()
    {
        view.endEditing(true)
    }
}

Rufen Sie self.hideKeyboard() in der viewDidLoad auf

98

Probieren Sie es aus, es ist getestet und funktioniert:

Für Swift 3.0/4.0

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

Für ältere Swift  

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) {
    self.view.endEditing(true)
}
55
iAnurag

In diesem Fall gibt es UITapGesture als eine der Optionen. Ich habe versucht, Beispielcode nur für den Fall zu erstellen. So was,

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var scrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let tapGesture = UITapGestureRecognizer(target: self, action: "tap:")
        view.addGestureRecognizer(tapGesture)
    }

    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
}
13
pixyzehn

Swift 3

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
}
13
Giang

Arbeitslösung für Swift 3, die mit ScrollView funktioniert

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var scrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // The next line is the crucial part
        // The action is where Swift 3 varies from previous versions
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tap(gesture:)))
        self.view.addGestureRecognizer(tapGesture)
    }

    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
}

Ein anderes Frage , das über dieses Problem spricht, auf das ich verwiesen und verwendet habe. Die akzeptierte Antwort funktioniert nicht mehr in Swift 3. Die aktuell ausgewählte Antwort sollte die folgende Antwort sein.

11
Devbot10

Einzelheiten

xCode 8.2.1, Swift 3

Aufgabe

Legen Sie UITapGestureRecognizer für die Ansicht von UIViewController fest, wodurch die Tastatur geschlossen wird und diese Funktionalität als Bool-Eigenschaft von UIView festgelegt wird.

Komplexe Implementierung, aber die Verwendung erfolgt in einer Zeile

klasse TapGestureRecognizer

import UIKit

class TapGestureRecognizer: UITapGestureRecognizer {

    let identifier: String

    private override init(target: Any?, action: Selector?) {
        self.identifier = ""
        super.init(target: target, action: action)
    }

    init(target: Any?, action: Selector?, identifier: String) {
        self.identifier = identifier
        super.init(target: target, action: action)
    }

    static func == (left: TapGestureRecognizer, right: TapGestureRecognizer) -> Bool {
        return left.identifier == right.identifier
    }
}

erweiterung UIView

import UIKit

extension UIView {

    private var disableKeybordWhenTappedGestureRecognizerIdentifier:String {
        return "disableKeybordWhenTapped"
    }

    private var disableKeybordWhenTappedGestureRecognizer: TapGestureRecognizer? {

        let hideKeyboardGesture = TapGestureRecognizer(target: self, action: #selector(UIView.hideKeyboard), identifier: disableKeybordWhenTappedGestureRecognizerIdentifier)

        if let gestureRecognizers = self.gestureRecognizers {
            for gestureRecognizer in gestureRecognizers {
                if let tapGestureRecognizer = gestureRecognizer as? TapGestureRecognizer, tapGestureRecognizer == hideKeyboardGesture, tapGestureRecognizer == hideKeyboardGesture {
                    return tapGestureRecognizer
                }
            }
        }
        return nil
    }

    @objc private func hideKeyboard() {
        endEditing(true)
    }

    var disableKeybordWhenTapped: Bool {

        set {
            let hideKeyboardGesture = TapGestureRecognizer(target: self, action: #selector(UIView.hideKeyboard), identifier: disableKeybordWhenTappedGestureRecognizerIdentifier)

            if let disableKeybordWhenTappedGestureRecognizer = self.disableKeybordWhenTappedGestureRecognizer {
                removeGestureRecognizer(disableKeybordWhenTappedGestureRecognizer)
                if gestureRecognizers?.count == 0 {
                    gestureRecognizers = nil
                }
            }

            if newValue {
                addGestureRecognizer(hideKeyboardGesture)
            }
        }

        get {
            return disableKeybordWhenTappedGestureRecognizer == nil ? false : true
        }
    }
}

Verwendungszweck

view.disableKeybordWhenTapped = true

Volle Probe

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let textField = UITextField(frame: CGRect(x: 50, y: 50, width: 200, height: 30))
        textField.borderStyle = .roundedRect
        textField.placeholder = "Enter text"
        view.addSubview(textField)

        view.disableKeybordWhenTapped = true
    }
}
5

Schau dir das an.

override func viewDidLoad() {
    var tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap))
    self.view.userInteractionEnabled = true
    self.view.addGestureRecognizer(tapGesture)
}

Dann ist Ihr Tipphandler.

  func handleTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}
5
handiansom

Für Swift 3

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

Dies funktioniert, wenn Sie außerhalb des Eingabebereichs eine beliebige Anzahl von Eingabeelementen berühren.

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }
2
Venkat Ram

Jede Berührung anders von Textfeld Tastatur schließen oder resignfirstresponder verwenden

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 UITouch *touch = [touches anyObject];
 if(![touch.view isMemberOfClass:[UITextField class]]) {
     [touch.view endEditing:YES];
 }
}
1
Miguel Monteiro

Ich hatte das gleiche Problem und habe es endlich gelöst!

Legen Sie einen TapGestureRecognizer in Ihrem Storyboard und dann einen Auslass in Ihrem ViewController fest

@IBOutlet var tapGesture: UITapGestureRecognizer!

Stellen Sie dann eine IBAction in Ihrem ViewController ein

@IBAction func DismissKeyboard(sender: UITapGestureRecognizer)
{
 self.view.endEditing(true)
} 

fügen Sie diese Zeilen zu Ihrer viewDidLoad-Methode hinzu

override func viewDidLoad()
{
    super.viewDidLoad()
    self.view.addGestureRecognizer(tapGesture)
}

und es sollte funktionieren

Hoffe das wird helfen!

1
Lynkz7
func findAndResignFirstResponder(_ stView: UIView) -> Bool {

    if stView.isFirstResponder {
        stView.resignFirstResponder()
        return true
    }
    for subView: UIView in stView.subviews {
        if findAndResignFirstResponder(subView) {
            return true
        }
    }
    return false
}
1
Subhajit

Gehen Sie zu Tastaturtyp und wählen Sie Standard oder für was auch immer Sie das TextField benötigen. Dann überschreiben Sie eine Methode, rufen Sie sie auf, was immer Sie möchten. Ich nenne es normalerweise Berührungszeichen. Nachfolgend haben Sie vergessen, hinzuzufügen

super.touchingBegins(touches, withEvent: event)
 }
0
Katz

Ich habe diese Methode in Obj-C erstellt, die eine Tastatur verbirgt, unabhängig davon, wo der Benutzer gerade tippt:

//call this method
+ (void)hideKeyboard {
    //grab the main window of the application
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    //call our recursive method below
    [self resignResponderForView:window];
}

//our recursive method
+ (void)resignResponderForView:(UIView *)view {
    //resign responder from this view
    //If it has the keyboard, then it will hide the keyboard
    [view resignFirstResponder];
    //if it has no subviews, then return back up the stack
    if (view.subviews.count == 0)
        return;
    //go through all of its subviews
    for (UIView *subview in view.subviews) {
        //recursively call the method on those subviews
        [self resignResponderForView:subview];
    }
}

Ich hoffe, das ist übersetzbar in Swift und macht Sinn. Es kann überall in der Anwendung aufgerufen werden und wird die Tastatur verbergen, egal was VC Sie bist auf oder so.

0
AlexKoren

Führen Sie einen Tipp-Gesten-Erkenner ein und legen Sie die entsprechenden Schritte fest. 

Verwenden Sie den Code:

Name Ihres Textfeldes . resignfirstresponder ()

0
kuni

In Swift4

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

// In Swift 4. Es hat für mich funktioniert.

func setupKeyboardDismissRecognizer(){
    let tapRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(searchingActivity.dismissKeyboard))

    self.view.addGestureRecognizer(tapRecognizer)
}

    @objc func dismissKeyboard()
    {
        view.endEditing(true)
        searchTableView.isHidden = true
    }

// Rufe diese Funktion setupKeyboardDismissRecognizer () in viewDidLoad auf

0
Raghib Arshi