2012-05-15 16 views
5

modelini güncellemiyor. Modelime bağlı bir NSTextField var. Metin alanının içeriğini programsal olarak değiştirirseniz, model güncellenmez. update the model instead'a ihtiyacın olduğunu biliyorum.Kakao Bağlamaları ile, NSTextField değerinin programatik olarak değiştirilmesi, model

Ancak, sayısal değeri değiştirmek için fare üzerinde gezinirken bir kaydırmayı tanıyan bir NSTextField alt sınıfını uygulamaya çalışıyorum. Açıkçası, bu alt sınıftan modele erişimim yok. Yani bunu nasıl yapabileceğimi önerdin mi?

ÇÖZÜM (noa sayesinde):

- (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]; 
} 

cevap

6

Yapabilirsin kullanım hedef aksiyon veya Kakao Bağlar ya:

  1. Hedef eylem: Bazı metin alanın eylem seçici bağlamak denetleyicinin updateValue eylemi. Ardından, metin alanında, metin alanının değerini değiştirdikten sonra seçiciyi çağırın. Eylem, metin alanının değerini getirmeli ve modele yaymalıdır.

  2. Kakao Bağlamaları: Metin alanının Değer bağını model nesnesinin KVO uyumlu özelliğine ayarlayın. Daha sonra hücrenin değerini güncelleyebilir ve bağlayıcı sizin için model nesnesini güncelleyecektir.

Bu özel tasarımların avantajı, metin alanı ile model özelliği arasındaki bağlamanın, bağlayıcı veya hedefle ele alınmasıdır. Farklı bir mülk için bir metin alanı kullanmak istiyorsanız, özel metin alanı kodunu değiştirmeden yalnızca farklı bir işlem veya farklı bir ciltleme kullanabilirsiniz.

Muhtemelen, daha az çalışmayı düşündüğüm bağlayıcıları kullanıyorum, ancak hedef-eylem de gayet iyi ve biraz daha basit.


Gerçekten, "ciltli" demişsiniz. Metin alanında programlı değişikliklerin bir güncellemeyi tetiklediğini düşündüm, ancak durum böyle olmadığından bağlı değeri kendiniz güncelleyebilirsiniz. İşte deneyebileceğiniz bazı kodlar:

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

Dediğim gibi, bağlayıcıları kullanıyorum. Metin alanımın değeri, model nesnesimin KVO uyumlu özelliğine bağlı. Benim problemim, metin alanının değerini el ile değiştirdiğimde ancak programatik olarak değiştirilmediğinde ciltleme yalnızca model nesnesinin özelliğini günceller. – DrummerB

+0

Hatam, ilişkili denetimlere yönelik program güncellemelerinin modeli güncellediğini düşündüm. Gönderilecek bazı kodları arayacağım. – paulmelnikow

+0

Maalesef durum böyle değil. Yardım etmeye çalıştığınız için teşekkürler! – DrummerB