2008-12-10 24 views
5

可以說我有一個視圖myView,一個視圖控制器myViewController和一些模型對象myModel。此外,假設該型號具有兩個KVO兼容屬性,arrayOfPeopleNamesarrayOfAnimalKinds(均爲NSStrings)。MVC和可可綁定最佳實踐問題

在我看來,我想有兩個彈出窗口綁定到這兩個數組的內容。

我的問題是,如果myController引用了myModel,並且下拉列表綁定到myViewController,那麼沿着myModel.arrayOfPeopleNames的行設置一個keypath是一種很好的做法嗎?

或者我需要在myViewController中設置一個額外的NSArray,它反映myModel中的一個,並綁定到該keypath?從實現的角度來看,前者似乎更簡單一些(我不必讓控制器數組鏡像模型數組),但是我想知道它是否將模型公開給視圖。

意見?

回答

8

您不應該在控制器中鏡像模型的陣列。雖然我不會太在意在一個非常簡單的情況下直接綁定到模型的數組,但您也可以將您的UI對象綁定到管理模型數組的NSArrayController。這將提供模型和UI之間的分離,更重要的是處理排序,選擇,添加和刪除對象等任務。

由於擔心KVO和綁定違反了「純粹」模型視圖控制器設計,我可以看到你來自哪裏,但這不是你應該擔心的。即使KVO通知直接從模型傳遞到視圖,但設置和更改視圖和模型之間的連接仍然是控制器的責任(僅在這種情況下,它是通過IB完成的)。例如,您不希望模型對象獲取對視圖的引用,並將其自身綁定到UI,這將是控制器的責任。

作爲可避免的事情的另一個例子,考慮是否您的模型有一個「動物ID」數組而不是名稱。與其創建方法來將動物ID翻譯爲模型中的可讀動物名稱,您可能反而想創建一個值轉換器或格式器來執行轉換。這可以讓您保持模型和視圖之間的分離程度。

請記住,設計模式的目的是降低編碼問題解決方案的複雜性,而不是增加它。你會發現,這正是Cocoa的工作方式,儘管它可能並不總是遵守模式的最嚴格定義。

+0

謝謝馬克,這很有道理。我很感謝你最近爲我提供的答案所有問題:)。 – 2008-12-10 18:21:49