2011-12-20 13 views

Odpowiedz

-3

Podłącz metodę przy użyciu celu/działania do zdarzenia sterującego UIControlEventEditingChanged w instancji UITextField. Można to zrobić w konstruktorze interfejsów lub w kodzie, dodając parę cel/działanie do pola tekstowego, a następnie wdrażając określoną metodę.

[self.textField addTarget:self action:@selector(textFieldTextChanged:) forControlEvents:UIControlEventEditingChanged]; 

UITextField deklaruje również protokół UITextFieldDelegate z metod, które można wdrożyć w swojej klasie być powiadamiany o zmianach instancji UITextField. Zalecam, abyś czuł się komfortowo z delegowaniem, ponieważ jest to wspólny wzorzec w strukturze Cocoa.

UITextFieldDelegate Class Reference

+2

[ 'UIControlEventEditingChanged'] (http://developer.apple.com/library/ios/documentation/uikit/reference/UIControl_Class/Reference/Reference.html#//apple_ref/doc/c_ref/UIControlEventEditingChanged) odnosi się tylko do edycji tekstu. Oznacza to, że akcja jest uruchamiana tylko wtedy, gdy tekst zmienia się, podczas gdy pole tekstowe 'isEditing'. Nie dotyczy to zmian wyboru. – ma11hew28

0

Ten link ma jedno rozwiązanie bez brudząc z prywatnych apis:

W skrócie: podklasy UITextField, wdrożyć

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender 

i czek jeśli zakres wyboru się zmienił. Ale to nie informuje o kranach.

Więc co zrobiłem to po podklasy, obserwować właściwość selectedTextRange:

-(void)awakeFromNib { 
    [self addObserver:self forKeyPath:@"selectedTextRange" options:0 context:nil]; 
} 

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    [self notifyDelegateIfNecessary]; 
} 

działa bardzo dobrze w systemów iOS 8.

+1

dlaczego nie przesłonić [UITextField setSelectedTextRange: (UITextRange *) selectedTextRange] jeśli tak czy nie podklasy UITextField? Wtedy wszystkie zmiany nadchodzą w tym miejscu. – Leo

+0

@Leo 1. Nie chcę zmieniać zachowania, tylko otrzymywać powiadomienia 2. Właśnie sprawdziłem w PlayGround i myślę, że nie możesz przesłonić tej funkcji. – Krisdigital

+0

To działa dla mnie (IOS 8 + 9). W ten sposób otaczam potrzeby, aby usunąć obserwatora w odpowiednim miejscu. – Leo

0

Istnieje prosty sposób na wykrycie wyboru w textField

dodawać obiekty mienia obserwatora w viewDidAppear

[self.keyboardInputFieldPassword addObserver:self forKeyPath:@"selectedTextRange" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; 

następnie dodać funkcję obserwować nieruchomości

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if([keyPath isEqualToString:@"selectedTextRange"] && self.keyboardInputFieldPassword == object) 
     [self textFieldDidChangeSelection:self.keyboardInputFieldPassword]; 
} 

To uchwycić zakres wyboru w UITextField

Aby śledzić c onvention należy removeObserver w viewDidDisappear

[self.keyboardInputFieldPassword removeObserver:self forKeyPath:@"selectedTextRange" context:nil]; 
Powiązane problemy