2011-12-20 16 views

risposta

-3

Collegare un metodo utilizzando target/azione all'evento di controllo UIControlEventEditingChanged nell'istanza di UITextField. Questo può essere fatto nel builder dell'interfaccia o nel codice aggiungendo una coppia obiettivo/azione al campo di testo e quindi implementando il metodo specificato.

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

UITextField dichiara anche un protocollo UITextFieldDelegate con i metodi che è possibile implementare nella classe ricevere una notifica di modifiche a un'istanza di UITextField. Vi raccomando di sentirvi a vostro agio con la delega poiché è un modello comune nel quadro di 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) si riferisce solo alle modifiche del testo. Ad esempio, l'azione si attiva solo quando il testo cambia mentre il campo di testo 'isEditing'. Questo non include i cambiamenti di selezione. – ma11hew28

0

Questo link ha una soluzione senza fare confusione con API private:

In breve: sottoclasse UITextField, implementare

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

e controllo se l'intervallo di selezione è cambiato. Ma questo non informa sui tap.

Quindi quello che ho fatto è dopo sottoclassi, osservare la proprietà 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]; 
} 

funziona molto bene in iOS 8.

+1

perché non eseguire l'override [UITextField setSelectedTextRange: (UITextRange *) selectedTextRange] se hai comunque eseguito la sottoclasse di UITextField? Quindi tutti i cambiamenti arrivano in questo posto. – Leo

+0

@Leo 1. Non voglio modificare il comportamento, ricevere solo le notifiche 2. Ho appena controllato PlayGround e penso che non sia possibile sovrascrivere quella funzione. – Krisdigital

+0

Funziona per me (IOS 8 + 9). In questo modo accerro le esigenze di rimuovere l'osservatore nel luogo adatto. – Leo

0

Non c'è modo semplice per rilevare la selezione in textField

add oggetto proprietà osservatore viewDidAppear

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

quindi aggiungere la funzione di osservare per la proprietà

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

Questo catturerà l'intervallo di selezione in UITextField

Per seguire la c onvenzione, si dovrebbe removeObserver in viewDidDisappear

[self.keyboardInputFieldPassword removeObserver:self forKeyPath:@"selectedTextRange" context:nil]; 
Problemi correlati