2012-02-28 31 views
4

我有一個iOS應用程序工作,並試圖清理一些代碼結構和實現。我想澄清我對MVC的理解並改進我的代碼。MVC:將模型指針傳遞給視圖?

問題:將模型傳遞給UIView是合法的,因此視圖可以基於模型元素的狀態來渲染它?

我在下面概括了一個例子,但是認識到它可能不清楚,太乏味閱讀,等等。要點是:如果一個UIView沒有改變模型中的任何值,它可以保留一個弱引用模型? (比較說總是要求它的委託返回一個臨時指針給模型)。

--thanks任何評論!

實施例:想象其表示與1個WINDOW每層有10層大樓一個UIView。這個MODEL是一個包含10個自定義WINDOW對象實例的NSArray。每個WINDOW obj。有一個狀態(燈亮或熄滅)和一個代表整個建築物視圖內WINDOW位置的CGRect。

BUILDING實例的控制器定義了構建視圖(它的框架)的大小以及所有的WINDOW對象,包括CGRects,它的狀態等,創建NSArray模型。然後,我將這個MODEL分配給BUILDING控制器的UIView(但保留是BUILDING控制器的一個強大屬性)。

UIView的需要了解窗口的狀態和的CGRect以繪製視圖drawRect

我想我可以單獨存儲CGRects因爲它們不是抽象的數據,但它似乎更容易給它的所有裝入對象的一個​​陣列。

回答

4

你在正確的軌道上。但是這個觀點沒有理由對這個模型有一個「弱」的參考。它適用於它有很強的參考片模式,它實際上是顯示的,除非你想件模型數據,以便能夠消失,而真實顯示它。那很不尋常。

說我有這個東西叫WindowPaneView,顯示WindowPane(只是爲了避免在這裏與UIWindow混淆)。控制器創建視圖沒有任何問題,並將其強制引用到WindowPane。在許多情況下,這是一個非常好的設計。

WindowPaneViewBuilding發出請求以獲取正確的窗口信息會出什麼問題。控制器先跟Building,瓜分殆盡的信息,以及手中的每個WindowPaneView其應有的Window

這也將是錯誤的,WindowPane瞭解的WindowPaneView什麼。這個模型永遠不會知道這些觀點。發生這種情況時,瘋狂迅速下降。但是觀點可能肯定知道他們直接展示的模型的具體部分。只是沒有更多。

+0

謝謝!我想我明白你在說什麼。我對'弱有點糊塗(或指定)'VS,因爲在您的評論'strong'參考'BuildingViewController'及其視圖將共享相同的壽命(按我的設計)。也許這並不重要,因爲這個?哦 - 我的模型不知道的意見,但我想知道存儲模型的CGRect數據 - 我** **能有一個平行陣列不是模型的數據的CGRect,但認爲還需要知道模型狀態爲了正確繪製,所以將它們包裝在一起似乎是有意義的。 – 2012-02-28 04:57:53

+1

CGRect只是數據。它代表關於繪圖的信息。它不吸引自己。管理CGRect數據的模型沒有問題。 – 2012-02-28 13:45:19

1

最好的選擇將取決於所涉及的對象的生命週期。

在您描述的示例中,您的控制器對象應保留模型和視圖,然後爲視圖提供對模型的弱引用。然後,您的控制器負責所有的內存管理,並且可以在模型發佈之前正確處理該視圖。

如果控制器沒有自己的模型對象(可以與許多不同的協作控制器對象的應用程序極易發生),那麼你有兩個選擇:

  1. 保留一個強大的參考的NSArray
  2. 握住NSArray的對象,該對象的NSView然後使用只要必要的副本(可能是深拷貝)。

總的來說,我會傾向於選項2,因爲它不需要任何長期的內存管理問題。

+0

OK感謝。我想我已經準備好了。我的控制者,它的觀點和模型將永遠生活或死在一起。正如我在下面提到的,我只是想知道,在模型中存儲CGRect數據是否開始用太特定的東西來「污染」它。它是靜態的 - 一旦創建不會改變,並且通用 - 每個「Building」將具有相同的一組CGRect。 – 2012-02-28 05:06:29