Frage

Ich habe eine UITextField in einer MyCustomUIView Klasse und wenn die UITextField Fokus verliert, würde Ich mag das Feld verstecken und etwas anderes an Ort und Stelle zeigen.

Der Beauftragte für den UITextField gesetzt wird über IB MyCustomUIView und ich habe auch 'Did On Exit Beenden' und 'Bearbeiten von End Did' Ereignissen an eine IBAction Methode innerhalb MyCustomUIView zeigen.

@interface MyCustomUIView : UIView { 

IBOutlet UITextField    *myTextField;

}

-(IBAction)textFieldLostFocus:(UITextField *)textField;

@end

Allerdings scheinen keine dieser Ereignisse ausgelöst werden, wenn die UITextField den Fokus verliert. Wie Sie trap / suchen Sie nach diesem Ereignis?

Der Beauftragte für den UITextField als MyCustomUIView so eingestellt, dass ich textFieldShouldReturn Nachricht erhalten die Tastatur zu schließen, wenn Sie fertig.

Aber was ich interessiere mich auch für herauszufinden, wenn der Benutzer auf dem Bildschirm einen anderen Bereich drückt (sagen wir eine andere Steuerung oder leeren Bereich) und das Textfeld hat den Fokus verloren.

War es hilfreich?

Lösung

Ich glaube, Sie brauchen Ihre Ansicht als UITextField Delegierten zu benennen, etwa so:

@interface MyCustomUIView : UIView <UITextFieldDelegate> { 

Als zusätzlichen Bonus, das ist, wie Sie bekommen die Tastatur weg zu gehen, wenn sie die „done“ oder Rückkehr Tasten drücken, je nachdem, wie Sie diese Eigenschaft festgelegt haben:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
  //This line dismisses the keyboard.       
  [theTextField resignFirstResponder];
  //Your view manipulation here if you moved the view up due to the keyboard etc.       
  return YES;
}

Andere Tipps

Versuchen Sie, für das folgende Verfahren unter Verwendung von Delegierten:

- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"Lost Focus for content: %@", textField.text);
    return YES;
}

Das funktioniert für mich.

Das Problem mit der ResignFirstResponder Lösung nur darin, dass es nur durch eine explizite ausgelöst werden kann Tastatur oder UITextField Veranstaltung. Ich war auch auf der Suche nach einem „verlorenen Fokus Ereignisse“, um die Tastatur zu verstecken, wenn irgendwo außerhalb des Textfeldes auf wurde angezapft. Die einzige enge und praktische „Lösung“ Ich kam across ist, für andere Ansichten Interaktionen zu deaktivieren, bis der Benutzer mit der Bearbeitung (trifft fertig / Return auf der Tastatur), aber immer noch in der Lage sein zu springen zwischen dem Textteil fertig ist, Korrekturen vorzunehmen, ohne die Notwendigkeit des Gleitens und in der Tastatur jedes Mal.

Das folgende Snippet vielleicht nützlich für jemanden, der das gleiche tun will:

// disable all views but textfields
// assign this action to all textfields in IB for the event "Editing Did Begin"
-(IBAction) lockKeyboard : (id) sender {

    for(UIView *v in [(UIView*)sender superview].subviews)
        if (![v isKindOfClass:[UITextField class]]) v.userInteractionEnabled = NO;
}

// reenable interactions
// assign this action to all textfields in IB for the event "Did End On Exit"
-(IBAction) disMissKeyboard : (id) sender {

    [(UIResponder*)sender resignFirstResponder]; // hide keyboard

    for(UIView *v in [(UIView*)sender superview].subviews)
        v.userInteractionEnabled = YES;
}

Sie müssen möglicherweise die UITextField Unterklasse und resignFirstResponder außer Kraft setzen. resignFirstResponder wird ebenso wie das Textfeld den Fokus verliert aufgerufen werden.

Ich glaube, Sie UIKeyboardDidHideNotification und in diesem Fall implementiert haben Sie

Verwendung Code wie

[theTextField resignFirstResponder];

Mit diesem Code entfernen.

auch denselben Code schreiben in textFieldShouldReturn Verfahren. dies auch den Fokus verloren.

Für die mit diesem in Swift kämpfen. Wir fügen eine Gestenerkenner der Ansicht des Viewcontroller, so dass, wenn die Ansicht angezapft wir das Textfeld entlassen. Es ist wichtig, die nachfolgenden Klicks im Hinblick auf die nicht gelöscht werden.

Swift 2.3

    override func viewDidLoad() {
        //.....

        let viewTapGestureRec = UITapGestureRecognizer(target: self, action: #selector(handleViewTap(_:)))
        //this line is important
        viewTapGestureRec.cancelsTouchesInView = false
        self.view.addGestureRecognizer(viewTapGestureRec)

         //.....
    }

    func handleViewTap(recognizer: UIGestureRecognizer) {
        myTextField.resignFirstResponder()
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top