2014-04-20 17 views
1

我會在前言中說我對整個編程場景都很新穎。儘管如此,我在第一個OS X應用程序中取得了一些進展,這是一個簡單的「Paint」風格的應用程序。但是,在閱讀了基於文檔的編程指南之後,我剩下幾個問題。作爲NSResponders的可可MVC和NSViews

我目前的設置是,我通過變量「通過」我的自定義對象,以達到它的目的地。 例如我有我的自定義視圖,它創建一個自定義控制器並將指針傳遞給它自己。控制器然後創建一個數據模型,並將對視圖的引用傳遞給數據對象。但是如果一個更高級的對象需要這些數據,我需要有一個方法和通知系統來讓它回來。此外,隨着更多對象指向變量,變得更加難以確保變量中的數據處於正確的狀態。

我想創建一個更加水平的設置,但是我遇到了一個問題:如何將通過NSView的NSResponder方法收集的數據轉換爲擁有的數據對象(是正確的術語?)水平控制器?從我註釋的文檔SDK指南中的這張圖說明了我的問題與推薦的設置: enter image description here

我知道我做了很多錯誤的事情,但我無法弄清楚如何做到這一點「正確的方法。有人能告訴我,我應該如何正確地將數據對象中的視圖封裝到數據對象中?

+1

視圖層不應創建控制器。這是落後的。控制器應該創建視圖。如果視圖需要對控制器的引用,則控制器將該引用傳入。(例如,在控制器是目標的目標操作中隱式地使用該引用)。模型圖層不應該具有對視圖的引用層。 –

+0

是的,我的新想法是擁有一個NSWindowController子類,用於管理所有視圖(因爲它們與窗口相關),還實例化自定義控制器對象,將引用傳遞給視圖,然後自定義控制器創建數據對象。然後,我將讓windowController將NSEvents從響應者鏈傳遞給自定義控制器,然後自定義控制器將在數據對象和視圖之間進行通信。希望那是不正確的? – PopKernel

+0

沒關係。對於不是窗口或視圖控制器的自定義控制器來說,接收「NSEvent」是有點不尋常的。通常,窗口,視圖或它們各自的控制器將事件解釋爲更高層次的抽象,如調用操作方法,通知或委託方法。 –

回答

1

我不確定我是否正確理解你的問題,但我想答案通常是:你不這樣做。

當視圖被輸入時,通知控制器。這可能是由代表團觀察,但在大多數情況下通過目標行動。響應者鏈在這一點上並不重點,它在後臺工作。

控制器還負責對所實例化和處理的模型進行所有更改。

在你的例子中NSDocument會爲你做一些這些數據模型的事情,但NSDocument並沒有在每個應用程序中使用。

其他方向通常通過網點工作,其中控制器填充用戶界面可能需要的所有數據。在基於NSDocument的應用程序中,NSDocument的子類通常會在此處使用控制器的一部分。

+0

是的,這很有幫助。爲了以更有活力的方式連接事物,我可以使用委派,KVO,目標行動和網點。我將通過整合這些概念來創建更強大的應用程序。 – PopKernel