2012-05-15 9 views
5

Mam NSTextField związany z mojego modelu. Jeśli programowo zmieniam treść pola tekstowego, model nie zostanie zaktualizowany. Wiem, że masz update the model instead.Z wiązaniami kakao, zmiana wartości NSTextField programowo nie aktualizuje modelu

Ale staram się zaimplementować podklasę NSTextField, która rozpoznaje przewinięcie, podczas gdy myszka unosi się nad nim, aby zmienić jego wartość liczbową. Oczywiście nie mam dostępu do modelu z tej podklasy. Masz jakieś sugestie, jak to zrobić?

ROZWIĄZANIE (dzięki 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]; 
} 

Odpowiedz

6

Można było też wykorzystanie docelowego działania lub kakao Wiązania:

  1. docelowa-action: podłączyć przełącznik działania pola tekstowego do niektórych updateValue akcja kontrolera. Następnie w polu tekstowym wywołaj selektor po zmianie wartości pola tekstowego. Akcja powinna pobrać wartość pola tekstowego i przekazać ją do modelu.

  2. Powiązanie kakao: Ustaw powiązanie wartości pola tekstowego z właściwością modelu obiektu zgodną z KVO. Następnie możesz zaktualizować wartość komórki, a środek wiążący zaktualizuje obiekt modelu.

Zaletą tych konkretnych projektów jest to, że sprzężenie między polem tekstowym a właściwością modelu odbywa się za pomocą wiązania lub celu. Jeśli chcesz użyć pola tekstowego dla innej właściwości, możesz po prostu użyć innej akcji lub innego powiązania, bez modyfikowania niestandardowego kodu pola tekstowego.

Prawdopodobnie użyłbym wiązań, ja, które uważam za mniej pracy, ale cel-akcja też jest w porządku, i trochę bardziej prosta.


Rzeczywiście, powiedziałeś "związany". Myślałem, że zmiany programistyczne w polu tekstowym wyzwalają aktualizację, ale ponieważ tak nie jest, możesz samodzielnie zaktualizować wartość związaną. Oto kod, który możesz wypróbować:

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

Tak jak powiedziałem, używam wiązań. Wartość mojego pola tekstowego jest powiązana z właściwością mojego obiektu modelu zgodną z KVO. Mój problem polega na tym, że powiązanie aktualizuje tylko właściwość obiektu modelu, gdy ręcznie zmieniam wartość pola tekstowego, ale nie wtedy, gdy jest ona zmieniana programowo. – DrummerB

+0

Mój błąd, myślałem, że aktualizacje programowe dla powiązanych elementów sterujących zaktualizowały model. Poszukuję kodu do opublikowania. – paulmelnikow

+0

Niestety tak nie jest. Dzięki za próbę pomocy! – DrummerB

Powiązane problemy