2012-08-13 101 views
2

我有一個非常簡單的問題,但解決方案證明非常難以捉摸。綁定NSComboBox來枚舉?

這是我有:

typedef { foo, bar, baz} EnumType; 

@interface SomeObject: NSObject 
@property EnumType someEnumValue; 
@end 

...並與object_controller和NSComboBox應顯示[object_controller選擇]實例的someEnumValue的字符串名稱的視圖。

我知道我不能直接訪問枚舉值的名稱作爲字符串。我已經嘗試創建一個NSArray持有枚舉值的名稱,並將ContentValues屬性綁定到它 - 這將加載組合框與屬性字符串,但我找不到任何方式來關聯所選實例中的枚舉值到組合框中的值。我也嘗試使用NSValueTransformer將枚舉值轉換爲NSStrings,反之亦然,但對於我的生活,我無法得到它的工作:大多數這些嘗試導致拋出的異常。

這個簡單的任務已經吸了我的生活大約三個小時。幫幫我!謝謝!

回答

1

有兩種方法可以解決您的問題。

  1. 使用字符串加載數組的順序與您的枚舉中的順序相同。既然你有其他的工作,查詢NSComboBox的「indexOfSelectedItem」會給你枚舉的確切值。 (注意:只有當你的枚舉從零開始時纔有效,我看你的例子是這種情況)

  2. 由於你已經創建了一個類來存放枚舉值。添加一個屬性,它將保存枚舉的名稱..再次查詢NSComboBox的indexOfSelectedItem.You現在可以很容易地通過訪問對象在給定的索引從你用來綁定到arrayController的arraftedObjects對象組合框。

+0

謝謝。我認爲這兩種解決方案都可以通過一些調整工作。 – 2012-08-17 15:44:06

0

記錄我的後代選擇的解決方案:

最後,我通過...不使用枚舉解決了這個問題。

問題當然是組合框希望綁定到一個對象數組(即NSObject的實例),但枚舉被定義爲常量整數(它是基元)。

我確定有可能提供一些基礎設施來將枚舉值轉換爲對象,然後再返回。 (表面上看,這就是NSValueTransformer類所做的事情,並且很容易進行子類化和設計...但在我的生活中,我找不到任何實際將我的NSValueTransformer子類或其實例綁定到組合的方式這個必不可少的步驟的文檔不存在,這真是太瘋狂了 - 我發現的每個例子都只是談論如何對它進行子類化,而不是如何綁定它,而我試過的所有東西都拋出了異常。)

最後,我意識到所有這些努力工作和翻譯都可以簡單地通過將枚舉值變爲類的實例來避免。

所以用枚舉,你必須做這一切:

typedef { a, b, c } EnumType; 
@interface SomeClass { 
    @property EnumType enumValue; 
}... 

// somewhere else, something like this: 
NSMutableArray *enumTypeNames = { @"a", @"b", @"c" }; 

...然後將組合框綁定到enumTypeNames,並執行一些雜技來將枚舉值轉換爲enumTypeNames索引,反之亦然。

或者,你可以這樣做:

@interface EnumClass { 
    @property NSString *name; 
} ... 
@interface SomeClass { 
    @property (weak) EnumClass *enumValue; 
} ... 

// somewhere else: 
NSMutableArray *enumValues = [NSMutableArray new]; 
[enumValues addObject: [EnumClass initWithName: @"a"]]; 
[enumValues addObject: [EnumClass initWithName: @"b"]]; 
[enumValues addObject: [EnumClass initWithName: @"c"]]; 

...和組合框直接綁定到陣列(指定爲模型的關鍵路徑名)。更清潔的解決方案。

0

我認爲你可以使用NSValueTransformer來完成此操作。

嘗試定義你這樣的枚舉:

typedef NS_ENUM(NSUInteger, EnumType) { 
    foo = 0, 
    bar = 1, 
    baz = 2 
}; 

然後在您的值轉換器,把輸入爲NSNumber和呼叫-unsignedIntegerValue。如果需要,將它轉換爲枚舉類型,通過switch語句運行它,並返回適當的字符串。

綁定應自動將枚舉值作爲NSNumber包裝。