2010-02-08 21 views
15

我一直在想了一會兒,問不同的人後,沒有任何人提供我所說的「至少有些具體的答案」:在MVC中,你把你的模型類的引用?

問:

如果在一個iPhone應用程序應該保留對其模型類的引用(使用MVC方法)?

在iPhone(和可可)應用程序,我們有我們所說的「應用程序代理」,這基本上開始的我們的應用程序和inits我們的控制器,也可以處理UITouch事件。

所以是在App代表控制器?一個模型類?沒有一個?我認爲不知道這也會讓人迷惑,知道在哪裏放置模型參考。

例子:

你的應用程序委託,該委託包含應用程序的視圖控制器的參考。如果我的應用程序將使用型號A類(這是一個網絡服務器守護程序類),以及存儲由Web服務器查詢數據的B類。

會在哪裏你們存儲A和B的參考? (App Delegate?View Controller?Both)

這裏有很多選擇,但作爲一個例子,我真的很想知道你們如何使用mvc來組合這個只使用一個View的應用程序。

回答

7

人們很容易把一切都在AppDelegate的,但如果你開始這樣做,那麼你的AppDelegate將以飽滿的參考黑客。如果你正在做一個嚴格的MVC,那麼你應該有3件事情:

  • 模型
  • 視圖控制器(僅適用於視圖邏輯)
  • 控制器(爲視圖和模型之間的協調)

因此,例如,我有一個模型Foo和一個Foo控制器。我會:

  • Foo.m(型號)
  • FooViewController.m(顯示一個Foo)
  • FooController.m(控制邏輯)

最後,要回答你問題,我會將我對Foo的引用存儲在foo Controller中。我喜歡用單身我的控制器,但那只是我。如果你使用一個單身,你可以做這樣的事情:[[FooController sharedInstance] listOfFoos],讓您的Foo的

+1

如果你只使用的.xib文件工作的GUI(通過界面生成器),你的「FooViewController.m(顯示一個Foo)」,那麼(只包含視圖邏輯)將相當於FooViewController.xib? – Goles 2010-02-08 15:05:49

+0

基本上是的。如果使用的是廈門國際銀行,你仍然將有一個後盾.m文件,而該文件是視圖控制器 – coneybeare 2010-02-08 15:15:19

1

傳統控制器創建模型,然後初始化與模型視圖。然後控制器監聽模型中的變化並查看並通過它來協調程序的流程。這將是我的通用答案,也許iPhone的發展在實踐中會有所不同。

1

在iPhone應用程序中,應用程序是否應該保留對模型類的引用(使用MVC方法)?

控制器層保持對模型層的引用。

那麼,應用委託一個控制器?一個模型類?沒有一個?

該App Delegate是一個控制器。

您會在哪裏存儲對A和B的引用?

A和B是通常由控制器層創建和擁有的模型類。

我真的很想知道你們會如何使用mvc來組合這個只使用一個View的應用程序。

控制器層的目的是允許模型和視圖圖層自成一體。該模型不應該知道關於控制器或視圖層的任何信息。該視圖不應該知道任何有關控制器或模型圖層的信息。控制器的工作是成爲模型的一端和視圖的雙端適配器。

我會成立您的示例應用程序是這樣的:

  • UIApplication的代表到AppDelegate中。
  • 如果你的服務器類(A)的操作簡單:
    • AppDelegate中創建並擁有服務器A類的實例(S)
  • 如果您的服務器類的操作(A)是複雜:
    • 創建一個專用控制器類(C)來控制服務器。
    • AppDelegate創建並擁有類C的實例。(C)的每個實例的一個實例(A)的實例。
    • C類的每個實例創建並擁有A級
  • AppDelegate中創建並擁有你的ViewController類的實例,加載並擁有您的視圖的一個實例。

問題中並不清楚B類的目的是什麼。

  • 如果這是一個僅用於A的數據塊(如配置數據或靜態網站數據),我會創建並由服務器(A)擁有它。
  • 如果它是在服務器運行期間創建,需要在視圖中顯示的數據,那麼你可能會想是這樣的:
    • 由A的一個可變數組,持有B的情況下
    • 另一個控制器類(D)引用該數組,並充當您的視圖的數據源/委託。
3

在我的應用我通常命名的AppDelegate類AppController的,如果這有助於解釋事情做得更好概念。您的應用程序控制器負責響應的NSApplication委託方法或創建和/或配置模型控制器(用來管理你的模型對象的集合)和窗口或視圖控制器,如果需要建立它們之間的引用,並呼籲這些控制器方法主菜單中的高級別操作方法。根據應用程序的複雜程度,您可能還會在應用程序控制器之外創建其他模型或視圖控制器。

當然,如果你有一個簡單的應用程序有沒有真正的理由不有,如果你想你的應用程序控制器播放模式控制器的角色。你想避免的是使用數百行代碼進行文件處理,所有這些都是在做概念上不相關的任務。

0

我發現,在大多數情況下,AppDelegate中提供了一個很好的地方放置一些基本功能(比如你想在每一個控制器施加一個背景圖像),但你會希望有額外的控制器和模型代碼的其他地方。 navController或rootController通常會作爲AppDelegate的屬性放置。

所以,我會說,是什麼地方更傾向於「不」,「沒有」和「控制器」,但倚之間。絕對不是「模特」!

相關問題