2014-10-17 26 views
0

我有必然NSMutableDictionaryNSMutableArray秒的NSArrayController綁定和有條件地設置隱藏

類似的東西:現在

[ 
    { "label" : "label1", "type" : "string" }, 
    { "label" : "label2", "type" : "boolean" } 
] 

,該陣列控制器被依次結合於NSCollectionView,其中每行(NSCollectionViewItem)表示初始陣列中的行。

而且我很明顯可以得到如下值:representedObject.label,representedObject.type等等。

現在,這裏的棘手的部分:

如果我要創建的hidden物業A的結合 - 讓我們說 - NSTextField,根據類型(某事像「如果類型==字符串setHidden: YES else setHidden:NO「,用簡單的英語),那麼綁定是如何實現的呢?我應該嘗試價值變形金剛嗎?


P.S.

  • 對目前的綁定,一切都該方案的偉大工程,我不希望 - 突然之間 - 開始創建一個爛攤子出來。 所以,任何建議都比歡迎!

  • 問題已被標記與以及(儘管我感興趣的OSX),因爲不應該有任何大的差異+ OSX,唯一的問題是可悲的是更容易被忽略。

回答

1

我發現,使用NSMutableDictionary的模型對象是快速和骯髒的原型OK但是,在實際的應用程序,你很快得到一個地步,你最好創建一個適當的模型類。現代Objective-C使這很容易:

@interface Thing : NSObject 

@property (copy) NSString* label; 
@property (copy) NSString* type; 

@end 

@implementation Thing 
@end 

就是這樣。現在,你需要「stringTyped」屬性,或者類似的東西。您添加:

@property (readonly) BOOL stringTyped; 

到接口和:

+ (NSSet*) keyPathsForValuesAffectingStringTyped 
{ 
    return [NSSet setWithObject:@"type"]; 
} 
- (BOOL) stringTyped 
{ 
    return [self.type isEqualToString:@"string"]; 
} 

來實現。 (你實際上並不需要的屬性添加到界面綁定找到它。)

+keyPathsForValuesAffectingStringTyped方法允許志願知道,當type屬性更改,也應該發出變更通知,以觀察員stringTyped屬性,如果有的話。看到+[NSObject(NSKeyValueObserving) keyPathsForValuesAffectingValueForKey:]看看爲什麼這個工程。

如果stringTyped財產並沒有真正在你的模型是有意義的,你其實可以通過該公司在控制器層中定義的類別添加屬性。基本上,您的控制器知道該模型,並且知道視圖需要將type屬性轉換爲隱藏屬性的方法。所以,它可以添加該翻譯層。在這種情況下,您可以將該屬性重命名爲hidden,因爲它可以反映視圖將如何使用它。

你絕對可以用一個數值轉換器來實現這一點。但是,理想情況下,您希望價值變換器是通用的,而不是專門針對單一視圖的需求。但這不是一條硬性規定。

P.S.

  • 問題已被標記與以及(儘管我感興趣的OSX),因爲不應該有任何大的差別+ OSX,唯一的問題是可悲的是更容易被忽略。

不這樣做。綁定在iOS上不可用,所以存在「巨大差異」。

+0

非常感謝。我就這樣做了......(順便說一句,我真的不知道Bindings是OSX專用的,哇。) – 2014-10-17 08:26:26