視圖知道如何與用戶交互。它知道如何顯示一些數據,如何處理事件,以及如何給用戶提供反饋。
視圖控制器知道什麼,但現在如何。它知道要顯示什麼數據,以及如何響應用戶操作。
UIButton知道如何顯示標題和圖像,以及如何跟蹤點擊,但不知道標題應該是什麼或點擊後該做什麼。
UITableView知道如何在單元格中顯示數據以及如何處理編輯,但它不知道要刪除單元格時顯示的數據或要執行的操作。爲此,它使用了一個委託和數據源,這通常是一個視圖控制器。
這是什麼和如何簡化設計和維護之間的劃分。你可以爲每種類型的表邏輯創建tableview的子類,但是你不能也控制其他視圖。視圖控制器可以控制幾個視圖並在它們之間進行協調。
編輯:
所以,你應該使用視圖控制器任何時候你需要:
- 多個視圖之間的協調。
- 模型數據和視圖之間的座標。
- 響應用戶與視圖的交互。
- 卸載並重新加載視圖。
請注意,視圖控制器不嚴格是UIViewController。你可能擁有一個由UIViewController擁有的視圖控制器,並處理一些視圖,但是派生自NSObject或其他任何視圖。視圖控制器管理以UIViewController爲根的視圖層次結構的一部分,並由該UIViewController擁有。 UIViewController反過來可以是以應用程序委託爲根的層次結構的一部分,並可能由導航,選項卡或其他元控制器擁有。
因此,應用程序委託擁有零個或多個元控制器,如UINavigationController。每個元控制器擁有一個或多個UIViewControllers。每個人都擁有一個視圖層次結構,並且可能擁有幾個簡單的視圖控制器,這些視圖控制器可以幫助管理視圖層次結構的一部分。如果不需要元控制器,那麼應用程序委託可以擁有或成爲UIViewController。
我假設BeachRunnerJoe理解MVC設計的基礎知識,但實際上想知道爲什麼一些早期的iPhone示例沒有專用的根視圖控制器,而是使用初始的AppDelegate類。這似乎主要是因爲基於Window和View的應用程序都有Xcode模板。有時,早期的應用程序示例非常基本,甚至可能會放棄創建NIB文件,然後直接以編程方式生成視圖。這是我注意到的,也是最近在學習iPhone開發時自問的。 – 2010-06-14 01:02:53
我通常使用應用程序委託作爲視圖控制器層次結構的所有者。它知道首先加載哪個視圖控制器,例如如果恢復保存的狀態,並且可以管理全局範圍模型對象。至於蘋果的例子,我認爲他們專注於一些事情,並在一個簡單的項目中簡化設計考慮。考慮到重量即使是一個簡單的例子,蘋果應該總是使用良好的設計模式,但是他們在練習他們所講的內容時遇到了困難。 – drawnonward 2010-06-14 02:15:20