1

說我有字典以下數組:綁定兩個不同的模型,關鍵路徑相同的NSArrayController的選擇

{ 
    { 
     isoName => en, 
     fullName => English, 
     localName => English 
    }, 
    { 
     isoName => de, 
     fullName => German, 
     localName => Deutsch 
    }, 
    { 
     isoName => fr, 
     fullName => French, 
     localName => français 
    } 
} 

我怎樣才能在fullName值綁定到一個NSPopUpButton控制的值,但綁定選擇的isoName到NSUserDefaults?我有一個NSArrayController與上面的數組一起設置,我的NSPopUpButton綁定到這個控制器,模型鍵路徑爲「fullName」,但我想保留isoName在NSUserDefaults中。這可能嗎?有沒有更好的方法來解決這個問題?

回答

1

首先,創建一個表示語言的模型對象類,並使這些模型對象的字典對屬性成爲可能。根據我的經驗,字典對Bindings來說效果不佳。綁定系統需要真實的模型對象。

接下來,創建一個控制器對象來容納這些模型對象。我將其稱爲LanguageKeeper。它有三個屬性:

  • languages(語言NSArray的對象)
  • selectedLanguage
  • selectedLanguageISOName

揭露最後一個爲綁定。另外,使另一個屬性的最後兩個屬性派生。我將ISOName屬性派生爲:getter將返回self.selectedLanguage.ISOName,setter將執行查找給定的ISO名稱並將self.selectedLanguage設置爲該語言對象。確保執行keyPathsForValuesAffectingSelectedLanguagekeyPathsForValuesAffectingSelectedLanguageISOName,並在每個方法返回的集合中包含其他屬性的名稱。

首先,將NSArrayController的內容數組綁定到LanguageKeeper的languages屬性。

然後,在彈出按鈕綁定三個屬性:

  • 內容NSArrayController中的arrangedObjects財產,留下模型的關鍵路徑空(或將其設置爲self如果這會導致問題)
  • 內容值相同的屬性arrangedObjects,用「fullName
  • 選定對象的所述LanguageKeeper的selectedLanguage特性的模型的關鍵路徑

最後,將LanguageKeeper上的selectedLanguageISOName綁定到User Defaults Controller的相應屬性。 (您不能直接將彈出按鈕綁定到UDC,因爲彈出按鈕需要您的模型對象之一)。

您也可以嘗試將彈出按鈕的內容綁定到isoName s和content-values綁定到數組中的字典fullName,但我很不信任使用原始對象作爲模型對象。過去我遇到了太多問題。此外,從長遠來看,使用模型對象會帶來收益,並且與它們合作非常有趣。

因此,與全部到位以上的,這裏是發生了什麼:

用戶更改彈出按鈕
  1. 彈出按鈕改變其選擇的對象屬性值的值。
  2. 這改變了LanguageKeeper的selectedLanguage屬性。
  3. 這改變了LanguageKeeper的其他屬性(selectedLanguageISOName)。
  4. 通過UDC更改用戶默認值。
其他一些對象改變
  1. 關於該值UDC訊息通知已經改變在用戶的默認值的值。
  2. 這改變了LanguageKeeper的selectedLanguageISOName屬性。
  3. 這改變了LanguageKeeper的其他屬性(selectedLanguage)。
  4. 這改變了彈出按鈕的selected-object屬性的值。
  5. 用戶在彈出菜單中看到新選擇的fullName

如果您不明白此答案的任何部分,請要求澄清。

+0

對不起,花了這麼長時間纔回到你身邊。我終於實現了你指定的(有一些細微的差別),它的工作非常好。謝謝! – dreamlax 2009-02-27 03:34:29

相關問題