2012-11-08 27 views
0

我有一個類有兩個屬性:NSString * fileName和NSDictionary *框架如下圖所示。如何綁定可可中的NSDictionary子字典的值?

  • 的NSDictionary *幀
    • 鍵:的NSString
    • 值:字段的實例字典
  • 的NSDictionary *字段
    • 鍵:NSNumber的(C++枚舉值)
    • 值:NSValue(C++對象指針)

我想用NSTableView創建一個master-detail視圖來列出每個文件。第一列中的fileName很容易進行綁定,但我無法弄清楚如何將任何列或者詳細視圖中的字段綁定到字段子字典中的值。

我想我無法綁定到C++對象方法。我想我需要一個自定義控制器的字段子字典中的值。是否有可能讓自定義控制器遵守KVC,以便我可以通過枚舉鍵訪問字段值,調用適合於由我使用的C++庫的枚舉定義的類型的方法?

或者,我應該將每個字段的數據存儲爲字段字典中的值嗎?在修改GUI中的值之後,我必須運行一個方法來處理字典,在這一點上,我可以重建C++字段對象並調用適當的方法。

無論如何,我的挑戰是搞清楚嵌套字典的綁定。

回答

0

我最終將每個字段的數據存儲爲「字段」子字典中的值。我沒有意識到我可以指定一個綁定到該值的鍵路徑。

例如,我有一個成員NSArray「tracks」的類,其中包含一組對象,每個對象都帶有成員NSDictionary「frames」,如我的問題中所述。 「軌道」是在我的GUI中用一個綁定了NSTableView的NSArrayController表示的。

在NSTableView中,我可以使用模型鍵路徑「objectValue.frames.key1.key2」將表格單元格的靜態文本綁定到表格單元格視圖。

同樣,在主 - 細節視圖的細節部分,我可以將文本字段單元格綁定到NSArrayController,其中「selection」作爲控制器鍵,「frames.key1.key2」作爲模型鍵路徑。

1

子類化NSController和朋友不太可能是這裏最好的方法。 Key/Value Coding,所有綁定所基於的API都依賴於keys/keyPaths是NSString,而不是NSNumbers(或任何其他類型)。如果您從使用NSNumber鍵切換到使用NSString鍵,您可能會發現這更容易。到那裏可以像使用在字符串和枚舉值之間來回轉換的switch語句實現兩個函數一樣簡單。

你已經意識到綁定一個指向C++對象的指針是沒有希望的,所以下面的討論假設你已經將這些值烘焙到了字典中。如果出於某種原因,您無法切換到在字段字典中使用NSString鍵,您也可以繼承NS [Mutable] Dictionary並重寫-valueForUndefinedKey:-setValue:forUndefinedKey:以執行此翻譯。子類化NS [Mutable] Dictionary並不是因爲心臟微弱,而是這些類由類集羣支持。這些文檔清楚地列舉了所有子類的要求,所以我不會在這裏介紹。此外,在您的-setObject:forKey:實施中,您需要確保將-willChangeValueForKey:-didChangeValueForKey:通知發送給與NSNumber鍵所做修改相對應的字符串鍵。

假設您最終將所有這些存儲在std::hash_map<enum, ptr>或其他一些C++類/結構中,橋接Objective-C的邏輯方法是創建一個新的模型類,該類包裝STL hash_map並提供KVC /使用NSString鍵的KVO語義,類似於上面描述的那樣處理翻譯。

+0

我發佈了NSString與NSNumbers之後發佈了我的問題。我結束了我的最後一個建議 - 將來自每個字段的數據存儲爲子字典中的值。我認爲現在只需要確定要使用哪些控制器對象,如何將它們鏈接到視圖,以及如何使用正確的鍵配置視圖等。 – Matt

相關問題