2013-02-08 12 views
8

İki pencerem var: Pencere A, NIB'den yüklenir; ve Window B programsal olarak oluşturulur.bind: toObject: withKeyPath: options: tek yönlü bir bağlantı mı?

Her iki pencere bir NSTextView vardır: Cam A textview arasında attributedString IB kullanılarak bir model özelliği text de bağlanmıştır; B penceresindeki metin görünümünün attributedString değeri -[NSObject bind:toObject:withKeyPath:options:] yöntemini kullanarak modelin text özelliğine bağlıdır.

[textview bind:@"attributedString" toObject:obj withKeyPath:@"text" options:nil]; 

İşte garip olan: Pencere B'de TextView'un gerçekten obj.text bağlıdır, ancak textview değişiklikler obj.text güncellendi asla. Ancak, Window A'nın metin görünümünde değişiklik yaparsam, obj.text ve B penceresindeki metin görünümü buna göre güncellenir.

Yani düşünüyorum, -[NSObject bind:toObject:withKeyPath:options:] yöntemi yalnızca tek yönlü bağlantı içindir. Kakao belgelerinde açık bir açıklama bulamadım. Bu problemle ilgili tecrübesi olan var mı? Kodda iki yönlü bağlamayı nasıl uygularsınız?

cevap

3

Kakao bağlamaları doğal olarak iki yönlüdür, ancak belirli davranışlar (metin alanlarının sürekli/canlı güncellenmesi gibi) özel seçeneklerin ayarlanmasını gerektirir. IB'de "Sürekli Güncelleme Değeri" onay kutusunun işaretli olduğundan emin olmak isteyeceksiniz. Programatik olarak eşdeğer davranışlar elde etmek için, bağlamada options belirtmeniz gerekir. Bu böyle görünebilir:

[textview bind: NSAttributedStringBinding 
     toObject: obj 
    withKeyPath: @"text" 
     options: (@{ 
       NSContinuouslyUpdatesValueBindingOption : @YES })]; 

O kurarken bir programlı bağlayıcı, bu IB bağlayıcı bir eşdeğerini kontrol ve programlı bağlama hepsi aynı ayarları geçiyoruz emin değer olduğunu belirtmekte yarar var. Örneğin, IB'de "Birden Fazla Değer Seçimini Düzenlemeye İzin Ver", "Koşullu Olarak Düzenlenebilir Setleri" ve "Uygulanamaz Anahtarları Yükselt" seçeneklerinin, bir NSTextView'ın İlişkilendirilmiş Dizesi ciltlemesi için varsayılan olarak seçildiğini görüyorum. Yani anlamına geleceğini bizim programlı muhtemelen gerektiğini bağlayıcı gerçekten gibi görünüm:

[textview bind: NSAttributedStringBinding 
     toObject: obj 
    withKeyPath: @"text" 
     options: (@{ 
       NSContinuouslyUpdatesValueBindingOption : @YES, 
       NSAllowsEditingMultipleValuesSelectionBindingOption : @YES, 
       NSConditionallySetsEditableBindingOption : @YES, 
       NSRaisesForNotApplicableKeysBindingOption : @YES })]; 
+0

Bu hala benim için çalışmıyordu. Cevabını (durumum için) burada buldum -> http://stackoverflow.com/questions/1169097/can-you-manually-implement-cocoa-bindings –

+0

Yukarıdaki bağlantılı sorunun alaka düzeyinden emin değilim . Burada belirtilen bağ, iki NSControl nesnesi arasındadır - özel bir bağlama uygulaması gerekmez. – stevesliva

2

Evet, bağlama: toObject: withKeyPath: seçenekleri: bir yoludur ve hiçbir seçenek bu etkileyebilir. Bu, .nib dosyasında bağlama yaptığınız ile aynı değildir. Her zamanki gibi Apple, dokümanlarında böyle basit bir şeyden bahsetmeyi unutmuştu. Buradaki en basit çözüm, bir öncekini oluştururken aynı anda ters bağlama oluşturmaktır. Bu, değeri atadığınızda kodunuzu ÖLDÜRMEZ. Kullanıcı varsayılanları ile ilgili örnek şu şekildedir:

// two way binding of MyObject.myValue to user defaults 
[NSUserDefaultsController.sharedUserDefaultsController.values bind: @"myValueInDefaults" 
                  toObject: myObject 
                 withKeyPath: @"myValue" 
                  options: @{@"NSContinuouslyUpdatesValue":@YES}]; 

[myObject bind: @"myValue" 
     toObject: NSUserDefaultsController.sharedUserDefaultsController 
    withKeyPath: @"values.myValueInDefaults" 
     options: @{@"NSContinuouslyUpdatesValue":@YES}]; 
+0

Bir NSValueTransformerBindingOption için bir değeri başka bir değere dönüştürmek gerekirse veya tam tersi gerekiyorsa iki NSValueTransformer kullanmam gerekir mi yoksa bir tanesi yeterli midir? – rraallvv

+0

Bu bağlamalar birbiriyle bağlantılı olmadığından, her bir ciltleme için bir tane olmak üzere iki adet NSValueTransformer'a ihtiyacınız olduğunu düşünüyorum. Ama ben NSValueTransformerBindingOption kullanmadım ve kesin olarak söyleyemiyorum. –

+0

Örneğin derecelerden radyanlara ve tam tersine, bence bunlara iki tane ihtiyaç olacağını düşünüyorum, teşekkürler – rraallvv

İlgili konular