2009-11-06 95 views
53

我總是想知道何時在iPhone上使用UIView與UIViewController。何時在iPhone上使用UIView與UIViewController?

我知道你不應該使用UIViewController,除非它是全屏視圖,但是還有其他的指導方針嗎?

例如,我想要構建一個模式疊加層 - 一個將在當前屏幕上滑動到位的屏幕。如果這個模式覆蓋是全屏的,它應該是一個UIViewController嗎?上一次我構建這樣的東西,我分類了UIViewController,但現在我想知道這是否正確。

回答

38

從蘋果公司的View Controller Programming Guide for iOS

「視圖控制器的最重要的作用是管理視圖的層次的每個視圖控制器呈包圍所有視圖控制器的內容的單根視圖若要在根視圖。 ,你可以添加你需要的視圖來顯示你的內容。「

另外:

「有兩種類型的視圖控制器:

  • 內容視圖控制器管理散片對應用內容,並且是主要的類型,您創建視圖控制器的
  • 集裝箱視圖控制器收集來自其他視圖控制器(稱爲子視圖控制器)信息和以有利於導航或不同地呈現那些視圖控制器的內容的方式來呈現它。

大多數應用程序是兩種類型的視圖控制器的混合物「。

+1

只需更新鏈接到蘋果指南:http://goo.gl/KF2wg – 2010-12-17 02:44:13

+1

這個答案需要改變,因爲它是非常過時和誤導包括我自己在內的很多人。這個答案几乎讓我在我的應用程序中改變了很多東西,直到我發現如果你在iOS5或更高版本中工作,它們都不適用。 VC不再被認爲是「UIViews裏面的屏幕」。 VC現在可以在ContainerView中包含其他VC,並被稱爲子VC或容器VC。 將一個子VC添加到父VC不會弄亂旋轉。它仍然會從父母VC的角度進行輪換。 – lespommes 2015-05-13 17:10:10

0

是在一個自包含的屏幕中滑動的東西嗎?我的意思是,它是否直接與父母互動?如果是,請將其設爲UIView,如果不是,可能會推薦UIViewController

+0

在這種情況下,疊加層是Lite應用程序的一部分。當用戶嘗試執行受限制的活動時,彈出模式疊加併發出警告。它將用於多個視圖控制器,但它會根據用戶試圖採取的操作說出不同的消息。覆蓋層基本上有一個消息和一個小UIWebView來顯示一個可點擊的廣告,將他們帶到應用商店的完整版本。 – 2009-11-06 22:32:36

+0

有趣。我認爲這可能以任何方式,但我可能會作爲一個UIView。我認爲UIView更容易在其他UIViewControllers上重用。但這當然是意見。 – marcc 2009-11-06 22:38:02

+0

我在我的應用中做了這個:用戶擊中了第3級,我提出了一個觀點,表示「你已經達到了最後一級,請點擊這裏進入應用商店併購買完整版本。」它被蘋果拒絕了。 – mahboudz 2009-11-07 00:52:07

11

這是一個很好的問題。

我的基本經驗法則。是應用程序的每個主要「頁面」都得到它自己的視圖控制器嗎?我的意思是,在應用程序設計的線框架階段,所有以其自身實體存在的東西最終都將由其自己的View Controller進行管理。如果有一個模式屏幕滑過現有的屏幕,我會認爲這是一個單獨的'頁面',並給它自己的視圖控制器。如果存在重疊和現有頁面的視圖(例如加載屏幕或幫助彈出窗口),我會以不同的方式處理這些頁面,將它們實現爲UIView子類,並將邏輯保存在「頁面」視圖控制器中。彈出窗口具有行爲,我將使用委託模式將信息反饋給該頁面的View Controller。

我希望這會有所幫助。這是一個非常哲學和建築的問題,可以寫很多。

4

每當一個視圖是全屏幕並且有插座/動作和/或子視圖時,我使用UIViewController。

0

UIView是UIViewController的一部分,請參閱UIViewController的view屬性。正如您正確指出的那樣,UIViewController管理一個完整的屏幕,並且一次只能有一個可見的UIViewController。但在大多數情況下,您將在屏幕上顯示更多UIViews或UIView的子類。

您給出的例子在大多數情況下都是正確的用法。正如你可能已經注意到,在繼承UIViewController的時候你會得到很多功能。動畫UIViewController的出現和解僱將是其中之一。

由於marcc指出,如果你想滑入的東西不是一個自包含的屏幕,你最好使用UIView。

作爲一個結論,我會說,如果你想使用UIViewController的子類的功能,而不是使它成爲一個UIViewController。否則UIView可能會更好。

itunes U Standford類在UIViewControllers上有一個很棒的講座我會推薦看一看它,因爲它有很多關於UIViewControllers的信息。

-1

屏幕變成一個UIViewController上把一切直到視圖控制器開始有太多的代碼,然後打出來的畫面變成由一個主視圖控制器包含多個UIViewControllers ...

要它放入上下文你的答案,爲該模式覆蓋製作一個視圖控制器。無論如何,如果您使用導航控制器來呈現它(並且您可能應該),它將會有一個。

+0

Upvoted,因爲這被無理地降低到-5。肯德爾的建議是一種選擇,本着重新構建需要的精神,而不是試圖提前預見一切。 – 2017-02-27 10:12:22

+0

謝謝,我認爲人們可能誤解了我的回覆,因此我爲了清晰起見而對其進行了更新。或者,也許人們只是喜歡預先優化... – 2017-03-28 20:24:12

+0

雖然這個答案並不令人驚訝,也許有點間接我同意它被過度懲罰,所以我給了+1。如果你真的迷失在什麼時候開始打破風險投資,這似乎是一個體面的起點。 – bitwit 2017-11-21 23:06:41

1

我有一些不同的方法:

覆蓋的UIView如果你打算做風俗畫的drawRect。否則,子類UIViewController並使用[self.view addSubview:blah]來添加頁面的組件。

還有其他一些特殊情況,但處理的情況下,約95%。

(你仍然會經常需要使用自定義的UIView一個UIViewController,但它是常見的有沒有相應的自定義的UIView自定義的UIViewController。)

0

如果您熟悉MVC模式,那麼你應該能夠了解UIVIew和UIViewController之間的區別。爲了做出簡單的聲明,UIView用於在屏幕上呈現UI元素。 UIView是幾乎所有Cocoa Touch UI元素的超類。這些元素不知道他們應該顯示的信息,當用戶點擊一個按鈕,他們應該做的,當一個異步網絡請求已完成,等會發生什麼。 UIViewController適用於所有這些和更多。視圖控制器負責將UI元素放置在屏幕上的正確位置,設置UI元素的內容,處理按鈕按壓和其他用戶輸入,在需要時更新模型等。

從概念上講,單個UIViewController控件iPhone應用程序中整個屏幕的內容,這就是爲什麼在視圖控制器方面往往容易想到事情的原因。如果你需要一個視圖,用戶可以選擇食譜的配料,那麼你需要一個UIViewController。我爲自己做了這樣的區分,因爲來自Java背景,我不習慣執行MVC的框架。我會以UIViews的方式考慮事情,並開始以這種方式實施它們,然後因此而遇到各種各樣的麻煩。如果你要堅持的UIKit爲您的應用程序,那麼蘋果已經爲你做的工作流程是:在你的應用程序的每個單獨的視圖中創建一個UIViewController子類,然後使用Interface Builder來放置UI元素,並創造按鈕連接它可以創造奇蹟,節省大量時間,讓您專注於使您的應用程序功能良好。

0
  1. 我使用UIViewController在全屏顯示視圖。

  2. 爲了更好地控制自定義視圖,我更喜歡UIViewController的子類而不是UIView,早些時候我使用UIView來製作自定義子類。

相關問題