2010-09-16 8 views
10

Sono un principiante con il cacao. Ho un pulsante e un campo di testo nella mia app. Voglio disattivare il pulsante quando il campo di testo è vuoto e abilitato quando l'utente digita qualcosa.Disabilita/Abilita NSButton se NSTextfield è vuoto o no

Qualsiasi punto di partenza? Qualsiasi associazione "magica" in Interface Builder?

Grazie

[Modificato]

Ive tentato di impostare l'AppDelegate come delegata NSTextfield's e inserito questo metodo (myTextField e myButton sono IBOutlets):

- (void)textDidChange:(NSNotification *)aNotification 
{ 
    if ([[myTextField stringValue]length]>0) { 
     [myButton setEnabled: YES]; 
    } 
    else { 
     [myButton setEnabled: NO]; 
    } 
} 

Ma non succede nulla ...

+0

Potrebbe provare la stessa cosa con [myTextField.text isEqualToString: @ ""] nella tua condizione, invece? – jv42

risposta

13

Ho provato a impostare l'AppDelegate come delegato di NSTextfield e aggiunto t il suo metodo (myTextField e myButton sono IBOutlets):

- (void)textDidChange:(NSNotification *)aNotification 
{ 
    if ([[myTextField stringValue]length]>0) { 
     [myButton setEnabled: YES]; 
    } 
    else { 
     [myButton setEnabled: NO]; 
    } 
} 

Questo è il modo più difficile, ma dovrebbe funzionare bene. O non hai collegato la presa del campo di testo a questo oggetto, non hai collegato la presa myTextField al campo di testo o non hai collegato la presa myButton al pulsante.

L'altro modo sarebbe quello di dare il controller di una proprietà di esporre il valore della stringa, legare del campo di testo value vincolante a questa proprietà stringValue, e legare di enabled il pulsante associazione al controller di stringValue.length.

È inoltre possibile assegnare al controller due proprietà, una con valore booleano, e impostarne una come dipendente dalla proprietà stringa e associare il pulsante a tale. Questa è una soluzione più pulita e possibilmente più robusta, anche se è più lavoro.

+1

Ciao Peter. Dopo alcuni mesi ho bisogno di risolverlo di nuovo con un'altra app. Ora che la mia conoscenza delle associazioni (e del cacao) è migliore, ho provato la tua soluzione e funziona perfettamente. E solo con una proprietà e due attacchi! (Molto più pulito rispetto all'utilizzo di metodi delegati, osservatori e punti vendita ...) Grazie mille – Azpiri

0

Grazie Peter. Quello che ho perso (nel mio versione hard way) è questo pezzo di codice nel awakeFromNib nella AppDelegate:

NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 
[center addObserver:self selector:@selector(textDidChange:) name:NSControlTextDidChangeNotification object:myTextField]; 

Funziona perfetto. Ora sto provando nel modo più semplice, ma temo di non essere ancora abbastanza bravo con gli attacchi.

di impegnare la proprietà

@property (retain) IBOutlet NSString *aStringValue; 

con il valore textfield's, che cosa devo usare in IB per "Associare a:", "Chiave di controllo" e "Modello chiave Path"?

3

Se si utilizza controlTextDidChange anziché textDidChange, è possibile eliminare il materiale di notifica e fare affidamento sul delegato di NSTextField.

9

Ecco una soluzione che utilizza i binding.

Di seguito viene impostato un NSTextField associato alla proprietà "text" del proprietario del file. "testo" è una NSString. Sono stato catturato da "Aggiornamento continuo valore". Pensare che la mia soluzione non funzionasse, ma in realtà non si aggiornava quando l'utente digitava, e solo quando il campo di testo aveva perso il focus.

Binding the NSTextField to the file's owner NSString text property

E ora la creazione di binding sul pulsante, è sufficiente impostare il suo stato abilitato alla lunghezza della proprietà di testo del proprietario del file.

Binding the NSButton's enabled state to the text property's length

annd, il prodotto di lavoro.

enter image description here enter image description here

+0

Sfortunatamente l'interfaccia utente è cambiata leggermente in Xcode 8. Ho creato una proprietà 'dynamic var text: NSString' ed è stato in grado di associare 'self.text 'al campo di testo, ma non riuscivo a far funzionare la seconda parte. Che cosa hai messo per la chiave del controller? – wcochran