2010-06-13 47 views
3

我正在潛心研究iPhone的開發,而我試圖讓我的頭腦是視圖控制器的核心概念之一。如果你看一下在蘋果開發站點的GLPaint例子,你會看到有一個項目...你什麼時候需要使用視圖控制器?

  1. 的應用程序委託類
  2. 它是一個UIWindow子類
  3. 而一個UIView子類

而uiview子類實現了所有核心圖形繪製邏輯並處理觸摸事件。我的問題是...

  1. 爲什麼沒有視圖控制器實現來處理該視圖邏輯?
  2. 您可以使用視圖控制器來實現該邏輯,還是必須在uiview子類中實現?
  3. 最後,您應該何時使用視圖控制器來實現視圖邏輯代碼?

非常感謝您的幫助!

回答

2

視圖知道如何與用戶交互。它知道如何顯示一些數據,如何處理事件,以及如何給用戶提供反饋。

視圖控制器知道什麼,但現在如何。它知道要顯示什麼數據,以及如何響應用戶操作。

UIButton知道如何顯示標題和圖像,以及如何跟蹤點擊,但不知道標題應該是什麼或點擊後該做什麼。

UITableView知道如何在單元格中顯示數據以及如何處理編輯,但它不知道要刪除單元格時顯示的數據或要執行的操作。爲此,它使用了一個委託和數據源,這通常是一個視圖控制器。

這是什麼和如何簡化設計和維護之間的劃分。你可以爲每種類型的表邏輯創建tableview的子類,但是你不能也控制其他視圖。視圖控制器可以控制幾個視圖並在它們之間進行協調。

編輯:

所以,你應該使用視圖控制器任何時候你需要:

  • 多個視圖之間的協調。
  • 模型數據和視圖之間的座標。
  • 響應用戶與視圖的交互。
  • 卸載並重新加載視圖。

請注意,視圖控制器不嚴格是UIViewController。你可能擁有一個由UIViewController擁有的視圖控制器,並處理一些視圖,但是派生自NSObject或其他任何視圖。視圖控制器管理以UIViewController爲根的視圖層次結構的一部分,並由該UIViewController擁有。 UIViewController反過來可以是以應用程序委託爲根的層次結構的一部分,並可能由導航,選項卡或其他元控制器擁有。

因此,應用程序委託擁有零個或多個元控制器,如UINavigationController。每個元控制器擁有一個或多個UIViewControllers。每個人都擁有一個視圖層次結構,並且可能擁有幾個簡單的視圖控制器,這些視圖控制器可以幫助管理視圖層次結構的一部分。如果不需要元控制器,那麼應​​用程序委託可以擁有或成爲UIViewController。

+1

我假設BeachRunnerJoe理解MVC設計的基礎知識,但實際上想知道爲什麼一些早期的iPhone示例沒有專用的根視圖控制器,而是使用初始的AppDelegate類。這似乎主要是因爲基於Window和View的應用程序都有Xcode模板。有時,早期的應用程序示例非常基本,甚至可能會放棄創建NIB文件,然後直接以編程方式生成視圖。這是我注意到的,也是最近在學習iPhone開發時自問的。 – 2010-06-14 01:02:53

+0

我通常使用應用程序委託作爲視圖控制器層次結構的所有者。它知道首先加載哪個視圖控制器,例如如果恢復保存的狀態,並且可以管理全局範圍模型對象。至於蘋果的例子,我認爲他們專注於一些事情,並在一個簡單的項目中簡化設計考慮。考慮到重量即使是一個簡單的例子,蘋果應該總是使用良好的設計模式,但是他們在練習他們所講的內容時遇到了困難。 – drawnonward 2010-06-14 02:15:20

0

視圖控制器主要適用於應用程序的全屏部分,您可以在界面構建器中進行佈局。每個視圖控制器都有一個視圖屬性,它指向一個UIView或它的一個子類,但它們管理的不僅僅是這些。一個View控制器總是全屏顯示,所以它可以實現像shouldRotateToInterfaceOrientation這樣的東西:而屏幕上可能有5個UIViews,只能有一個視圖控制器。

它也是MVC(模型 - 視圖 - 控制器)的重要組成部分。

視圖控制器連接視圖和模型。理論上講,模型應該完成數學工作,存儲數據和其他非UI。該視圖應該繪製和管理。它不應該存儲內容,它不應該做任何其他事情,真的。視圖控制器將兩者連接在一起。它可以從模型中查找數據,並將其提供給視圖。這樣,更少的代碼是特定於應用程序的。您可以重新使用模型和視圖,但大多數情況下很難在不修改的情況下重新使用控制器。

我不是專家,所以澄清,請評論。

1

如果您需要視圖控制器中未在視圖中找到的功能(反之亦然),則您應該知道使用哪個功能。例如,對於您的問題2,drawRect回調在UIView中可用,但不在UIViewController中。

到目前爲止,只要有一個.xib被涉及,我就會使用UIViewController

我喜歡在這些viewWillAppearviewDidAppearviewWillDisapperviewDidAppear方法中進行初始化和清理代碼(例如NSTimer)。在處理多個模式彈出窗口和多個視圖控制器時,在單個進入/退出點的團隊中尤其方便。

相關問題