11

我正在學習iPhone/iPad編程。我相信我理解MVC的概念;我遇到的困難是理解普通iPhone/iPad應用程序中的一些文件如何適合MVC。AppDelegate文件在哪裏適合MVC?

當您使用「基於視圖的應用程序」模板創建新應用程序時,會創建一個AppDelegate.m和AppDelegate.h文件。

是模型,視圖還是控制器文件?我猜這其實並不是那些。我希望我能看到一個圖或流程圖,顯示應用程序中每個文件屬於哪個類別。

回答

8

並非每個文件都適合特定的類別,但是,在這種情況下,我不得不說這個AppDelegate是一個控制器,它並不直觀地呈現數據(視圖),也不代表實際數據(模型),但它確定了什麼視圖控制器顯示等,並在應用程序開始時管理其他視圖(狀態欄等)。

我不會過分擔心試圖將每個文件分類到MVC中,有些只是完全不適合。

1

我查看AppDelegate中的控制器,因爲那種代碼

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
// Override point for customization after application launch. 

self.window.rootViewController = self.viewController; 
[self.window makeKeyAndVisible]; 
[application setStatusBarHidden:YES withAnimation:NO]; 
return YES; 
} 

的AppDelegate是模型和視圖之間建立聯繫的地方。
在AppDelegate中,您可以放置​​特定於您的應用程序的代碼。
視圖和模型應該能夠存在於其他應用程序(如UIView類)中,因爲它們不是特定於應用程序的。
這在Mac桌面應用程序中更爲明顯,在該Delegate中還有更多的工作要做。

2

應用程序委託是一個控制器對象。默認情況下,它是iOS應用中主窗口的所有者和控制者 - 這是一個視圖。應用程序委託從代表(或建模)應用程序本身的對象(UIApplication的實例)接收消息。它在應用程序對象(應用程序與系統之間的聯繫點)和應用程序的顯示之間進行調解。

0

這是一個古老的問題,但我今天只問自己同樣的問題。我認爲AppDelegate類不能僅被分類爲控制器。它做控制窗口,並建立其根控制器,因此它可以被分類爲視圖控制器(注:UIWindow繼承自UIView)。但它也執行更多與模型相關的任務,如應用程序終止時的數據持久性。所以它可以被認爲是一個模型控制器或者涉及到數據訪問層。

它也負責處理URL打開。這可能導致View更改,但也肯定需要與模型有關的任務,如解析,持久化,更新,身份驗證等。如果視圖/模型通過KVO綁定,則更新模型可能會導致必需的視圖更新。我覺得這將是一個更好的設置。另外,默認情況下,所有核心數據堆棧都添加到AppDelegate中,這一事實將使其遠離與View相關。

它認爲它負責任何與應用程序有關的事實導致它有多種用途。也許這就是爲什麼開發人員最終會拋出任何東西在這裏。它是根控制器,應用程序服務層和應用程序模型管理器意義上的應用程序管理器。

由於AppDelegate是應用程序的入口點(對於開發人員),因此根據應用程序討論它是有意義的。應用程序正在終止,應用程序正在輸入背景等。我們正在討論該應用程序,作爲型號實體。

+1

如果需要,您可以在View Controller中執行數據持久性,但這並不意味着您應該這樣做。在我看來,你應該把你已經登記的所有任務委託給真正的模型對象。 –