2009-07-15 16 views
17

Mam UITextField w klasie MyCustomUIView i gdy UITextField traci fokus, chciałbym ukryć pole i pokazać coś innego w miejscu.UITextField stracić fokus zdarzenia

Delegat dla UITextField jest ustawiony na MyCustomUIView poprzez IB i mam również „skończyła się w momencie wyjścia” i "Montaż Czy końcowych wydarzeń wskazując metody IBAction w terminie MyCustomUIView.

@interface MyCustomUIView : UIView { 

IBOutlet UITextField *myTextField; 

} 

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

@end 

Jednak żadne z tych zdarzeń nie wydaje się zostać wywołane, gdy UITextField straci fokus. Jak pułapkę/szukać tego wydarzenia?

Delegat dla numeru UITextField jest ustawiony jako MyCustomUIView, dlatego otrzymuję wiadomość textFieldShouldReturn, aby zamknąć klawiaturę po zakończeniu.

Ale to, co mnie również interesuje, to zastanawianie się, kiedy użytkownik naciśnie inny obszar na ekranie (powiedz inny element kontrolny lub po prostu pusty obszar), a pole tekstowe straci ostrość.

Odpowiedz

11

wierzę trzeba wyznaczyć swój pogląd jako delegat UITextField tak:

@interface MyCustomUIView : UIView <UITextFieldDelegate> { 

Jako dodatkowy bonus, to w jaki sposób można dostać klawiaturę odejść, kiedy nacisnąć przycisk „Gotowe” lub zwrot przycisków, w zależności jak masz ustawić tę właściwość:

- (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; 
} 
2

można mieć do podklasy UITextField i zastąpić resignFirstResponder. resignFirstResponder zostanie wywołany tak samo, jak pole tekstowe traci ostrość.

4

Problem z rozwiązaniem resignFirstResponder wyłącznie znaczy, że może być wywołany tylko przez wyraźnego klawiaturze lub UITextField wydarzenie. Szukałem też "zagubionego wydarzenia", aby ukryć klawiaturę, jeśli gdzieś poza polem tekstowym został podsłuchany. Jedyne bliskie i praktyczne "rozwiązanie", na które natknąłem się, to wyłączanie interakcji dla innych widoków, aż użytkownik zakończy edycję (uderzenie zakończone/powrót na klawiaturze), ale nadal będzie w stanie przeskakiwać pomiędzy polami tekstowymi, aby wprowadzić poprawki bez potrzeby wysuwania się i na klawiaturze za każdym razem.

następujący fragment może przydatne dla kogoś, kto chce zrobić to samo:

// 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; 
} 
26

Spróbuj użyć delegata w następujący sposób:

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

który pracował dla mnie.

1

myślę, że wdrożyliśmy UIKeyboardDidHideNotification iw tym przypadku jesteś

należy użyć kodu jak

[theTextField resignFirstResponder]; 

usunięcia tego kodu.

również ten sam kod wpisz w metodzie textFieldShouldReturn. to również straciło ostrość.

0

Dla tych, którzy walczą z tym w Swift. Dodajemy narzędzie do rozpoznawania gestów do widoku ViewController, dzięki czemu po dotknięciu widoku odrzucamy pole tekstowe. Ważne jest, aby nie anulować kolejnych kliknięć w widoku.

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() 
    }