2012-05-15 5 views
5

Ho un NSTextField associato al mio modello. Se modifico il contenuto del campo di testo a livello di codice, il modello non viene aggiornato. So che dovresti update the model instead.Con Cocoa Bindings, la modifica del valore di NSTextField a livello di codice non aggiorna il modello

Ma sto provando ad implementare una sottoclasse NSTextField che riconosce uno scroll mentre il mouse si passa sopra di esso per cambiarne il valore numerico. Ovviamente non ho accesso al modello da questa sottoclasse. Quindi hai qualche suggerimento su come potrei farlo?

SOLUZIONE (grazie a Noa):

- (void)scrollWheel:(NSEvent *)theEvent { 
    [self setFloatValue:[self floatValue] - [theEvent deltaY]]; 
    NSDictionary *bindingInfo = [self infoForBinding: NSValueBinding]; 
    NSObject *boundObject = [bindingInfo valueForKey:NSObservedObjectKey]; 
    NSString *keyPath = [bindingInfo valueForKey:NSObservedKeyPathKey]; 
    [boundObject setValue:[NSNumber numberWithFloat:[self floatValue]] 
       forKeyPath:keyPath]; 
} 

risposta

6

Si potrebbe o uso target-azione o cacao Associazioni:

  1. Obiettivo-Azione: collegare il selettore l'azione del campo di testo in una certa azione updateValue del controller. Quindi, nel campo di testo, richiamare il selettore dopo aver modificato il valore del campo di testo. L'azione dovrebbe recuperare il valore del campo di testo e propagarlo al modello.

  2. Cocoa Bind: imposta il binding del campo di testo su una proprietà conforme a KVO di un oggetto modello. Quindi puoi aggiornare il valore della cella e il raccoglitore aggiornerà l'oggetto del modello per te.

Il vantaggio di questi particolari design è che l'accoppiamento tra il campo di testo e la proprietà del modello viene gestito sia con il binding sia con il target. Se si desidera utilizzare un campo di testo per una proprietà diversa, è possibile utilizzare semplicemente un'azione diversa o un'associazione diversa, senza modificare il codice del campo di testo personalizzato.

Probabilmente userò i binding, io stesso, che considero meno laborioso, ma anche l'azione del target è perfettamente soddisfacente e un po 'più semplice.


In effetti, hai detto "vincolato". Ho pensato che le modifiche programmatiche al campo di testo attivassero un aggiornamento, ma poiché non è così, puoi aggiornare il valore associato da solo. Ecco alcuni codici che puoi provare:

NSDictionary *bindingInfo = [self infoForBinding:NSValueBinding]; 
[[bindingInfo valueForKey:NSObservedObjectKey] setValue:self.integerValue 
              forKeyPath:[bindingInfo valueForKey:NSObservedKeyPathKey]]; 
+0

Come ho detto, sto usando i binding. Il valore del campo di testo è associato a una proprietà conforme al KVO del mio oggetto modello. Il mio problema è che il binding aggiorna solo la proprietà dell'oggetto modello quando cambio manualmente il valore del campo di testo, ma non quando è cambiato a livello di codice. – DrummerB

+0

Errore mio, pensavo che gli aggiornamenti programmatici ai controlli associati aggiornassero il modello. Cercherò del codice da pubblicare. – paulmelnikow

+0

Sfortunatamente non è così. Grazie per aver cercato di aiutare! – DrummerB