2014-11-25 96 views
2

我想了解可可綁定的方向性。特別是,我寫了這個小程序來演示綁定,我不確定它爲什麼輸出它的功能。下面是程序:可可綁定不反向更新

@interface SimpleClass : NSObject 
@property (retain) NSString *s; 
@end 

@implementation SimpleClass 
@end 

int main(int argc, char *argv[]) { 
    SimpleClass *simpleClass1 = [[SimpleClass alloc] init]; 
    SimpleClass *simpleClass2 = [[SimpleClass alloc] init]; 

    [simpleClass1 bind:@"s" toObject:simpleClass2 withKeyPath:@"s" options:nil]; 

    //[simpleClass1 willChangeValueForKey:@"s"]; 
    simpleClass1.s = @"Hello, World!"; 
    //[simpleClass1 didChangeValueForKey:@"s"]; 

    NSLog(@"%@", simpleClass1.s); 
    NSLog(@"%@", simpleClass2.s); 

    simpleClass2.s = @"Something else!"; 

    NSLog(@"%@", simpleClass1.s); 
    NSLog(@"%@", simpleClass2.s); 

    return 0; 
} 

當我運行這個程序,輸出是:

Hello, World! 
(null) 
Something else! 
Something else! 

這使我相信,綁定是單向的。但是,我遇到thisthis,似乎都說綁定應該是雙向的(雖然都不是很清楚)。取消註釋willChangeValueForKey和didChangeValueForKey行不會影響輸出。

我的結論是否正確,綁定是單向的?或者有什麼方法可以在綁定創建時指定它應該是雙向的?

+0

檢查此帖:http://stackoverflow.com/questions/14775326/bindtoobjectwithkeypathoptions-is-one-way-binding – user1502383 2014-11-25 06:55:28

+0

正確;我已經把這個問題與這個問題聯繫起來了。關於「NSContinuouslyUpdatesValueBindingOption」這個問題的答案似乎與綁定的方向性無關。 – Litherum 2014-11-25 07:01:04

+0

結論不應該是「這使我相信綁定是**唯一的定向。」? – MartinW 2015-06-03 19:40:29

回答

3

NSObject中綁定的默認實現是單向的。綁定實際上是read-only

其他Cocoa類覆蓋全部或部分默認實現以提供更強大的功能。蘋果指導如何在你自己的課堂上做到這一點是here。請注意,我不認爲Cocoa的任何類都會以這種方式實現綁定。

另請參閱message flow in bindings的討論。

請注意,因爲一個類可以實現NSKeyValueBindingCreation協議,所以它的名稱不一定與屬性相對應。例如,NSTextField有一個"value" binding,但沒有「value」屬性(沒有符合此屬性的鍵值編碼命名約定的getter或setter)。

NSObject提供的默認實現的確發生了碰巧使用KVC設置與綁定對象的屬性發生更改時綁定的對象的綁定具有相同名稱的屬性的事實,該實現特定於該實現。當然,任何不會覆蓋該實現的東西都會繼承它,但有些類會覆蓋它。