Vorrei poter rilevare se un testo è stato modificato in un UITextField
in modo che sia possibile abilitare uno UIButton
per salvare le modifiche.Rilevamento di una modifica al testo in UITextfield
risposta
Sfrutta la notifica UITextFieldTextDidChange o imposta un delegato nel campo di testo e osserva textField: shouldChangeCharactersInRange: replacementString.
Se si desidera guardare per le modifiche con una notifica, avrete bisogno di qualcosa di simile nel codice per registrare per la notifica:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:theTextField];
Ecco theTextField è l'istanza di UITextField che si vuole guardare . La classe di cui sé è un esempio nel codice di cui sopra deve quindi implementare textFieldDidChange, in questo modo:
- (void)textFieldDidChange:(NSNotification *)notification {
// Do whatever you like to respond to text changes here.
}
Se il campo di testo sta per sopravvivere l'osservatore, allora si deve annullare la registrazione per le notifiche nella dealloc dell'osservatore metodo. In realtà è una buona idea farlo anche se il campo di testo non sopravvive all'osservatore.
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
// Other dealloc work
}
È possibile aggiungere un membro della classe come questo NSString *changeTemp
, quindi
changetemp = textfield;
if(change temp != textfild){
changetemp=textfild;
NSLog(@" text is changed"
} else {
NSLog(@" text isn't changed"):
}
Si potrebbe creare una variabile per memorizzare la stringa originale, quindi registrare con il centro di notifica per ricevere UITextFieldTextDidChangeNotification
evento:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateButton:) name:UITextFieldTextDidChangeNotification object:nil];
Quindi, creare un metodo per ricevere la notifica e confrontare il valore corrente del campo di testo con il valore originale
-(void) updateButton:(NSNotification *)notification {
self.myButton.enabled = ![self.myTextField.text isEqualToString:originalString];
}
Non dimenticare di annullare la registrazione della notifica quando il controllore di vista è deallocato.
[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];
Per questo, in primo luogo è necessario avere il campo di testo lo hanno delegare di riferimento assegnato. E il delgate, dovrebbe preferibilmente essere il controller di vew che è il proprietario dei file della vista. Che va come
myTextField.delegate = myViewControllerReferenceVariable
E nell'interfaccia viewController, dicono sarete implementando UITextFieldDelegate da
@interface MyViewController:UIViewController<UITextFieldDelegate>
E nel tuo vista del regolatore di override implementazione
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
Così il codice sarà like
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
text = [textfield.text stringByReplacingCharactersInRange:range withString:string];
if (textfield == refToTextFieldYouWantToCheck) {
if (! [textToCheck isEqualToString:text]) {
[theButtonRef setEnabled:YES];
}
}
return YES; //If you don't your textfield won't get any text in it
}
È inoltre possibile iscriversi alla notifica che è sorta di disordinato IMHO È possibile trovare come farlo here.
Ancora una volta apprezzo molto l'aiuto, ma non è solo vedere se viene inserito del testo? (cioè la lunghezza è ora> 0) C'è del testo già nel campo di testo e voglio rilevare se è cambiato. – RGriffiths
@RichardGriffiths Spiacente, ho pensato che volevi controllare l'esistenza di un contenuto, l'ho corretto ora. Stai cercando di inserire un testo segnaposto? –
Questa è la risposta corretta, non sono sicuro del motivo per cui non è accettata. Questo particolare metodo verrà attivato ogni volta che un nuovo carattere viene inserito o cancellato. Se vuoi solo controllare se la lunghezza del contenuto è maggiore di 0, usa uno degli altri metodi delegate come didBeginEditing, ect – barndog
invece di osservare le notifiche o di attuazione textField:shouldChangeCharacterInRange:replacementString:
, è più facile per aggiungere solo un target dell'evento:
[textField addTarget:self
action:@selector(myTextFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
- (void)myTextFieldDidChange:(id)sender {
// Handle change.
}
Nota che l'evento è UIControlEventEditingChanged
e nonUIControlEventValueChanged
!
I vantaggi rispetto alle altre due soluzioni proposte sono le seguenti:
- Non è necessario ricordarsi di annullare la registrazione il controller con la
NSNotificationCenter
. - Il gestore eventi viene chiamato dopo la modifica è stata apportata il che significa che
textField.text
contiene il testo effettivamente inserito dall'utente. Il metodo delegatotextField:shouldChangeCharacterInRange:replacementString:
si chiama prima delle le modifiche sono state applicate, quinditextField.text
non ti fornisce ancora il testo appena inserito dall'utente - dovresti prima applicare la modifica.
come posso rilevare l'evento della pressione del tasto Backspace in questo metodo "myTextFieldDidChange". Mezzi potresti spiegare 'dovresti applicare il cambiamento prima tu stesso'. parte dalla tua risposta? – ViruMax
@ViruMax: la notifica non è intesa a rilevare la pressione di un singolo tasto. Tuttavia, se si salva il valore del campo di testo in una proprietà che si aggiorna nel gestore di notifica, è possibile confrontare le lunghezze prima di aggiornare la proprietà e quindi sapere se i caratteri sono stati rimossi, sostituiti o aggiunti. Per quanto riguarda "dovresti applicare tu stesso la modifica": vedi [la risposta che si occupa del metodo 'UITextFieldDelegate'] (http://stackoverflow.com/a/15490405/400056) (devi chiamare' stringByReplacingCharactersInRange: withString : 'per ottenere la stringa di risultati del cambiamento). – DarkDust
Swift 3,0
Processo 1
Crea IBOutlet di UITextfiled e Aggiungere Target al testo campo.
m_lblTxt.addTarget(self, action: #selector(self.textFieldDidChange), for: UIControlEvents.editingChanged)
func textFieldDidChange(textField:UITextField)
{
NSLog(textField.text!)
}
Processo 2
m_lblTxt.delegate = self
//MARK: - TextField Delegates
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
{
print(textField.text!)
return true
}
Questo può essere realizzato in Interface Builder sulla Editing Changed
caso di UITextField
. Trascina da esso sul tuo codice e crea un IBAction
.
Ad esempio:
@IBAction func textFieldChanged(_ sender: UITextField) {
print(sender.text)
}
Questo evento è la stessa descritta in altre risposte qui che la proprietà .text
contiene il metodo di scrittura aggiornato quando viene attivato. Ciò può aiutare a ripulire la confusione di codice non dovendo aggiungere l'evento a ogni livello di codice a ogni UITextField
nella vista.
Grazie per l'aiuto, ma ho difficoltà con la sintassi. Penso che dovrebbe essere qualcosa di simile - UITextFieldTextDidChange (void): (UITextField *) textField { azione da intraprendere } ma non sembra funzionare – RGriffiths
Per le notifiche è necessario registrare un osservatore per la notifica con NSNotificationCenter . Dai un'occhiata alla documentazione Apple per NSNotificationCenter. Questo è un modello molto comune nello sviluppo di applicazioni iOS e Mac OS X. –
Grazie per il tuo aiuto - ho dato un'occhiata e non vedo cosa devo fare. Scusa - nuovo a tutto questo. – RGriffiths