2012-02-23 64 views

回答

6

蘋果,因此大多數人遵循蘋果的指導方針會告訴你這是不好的做法,蘋果公司爲此增加了ViewController遏制(childViewControllers)。不幸的是,大多數人盲目地遵循這一點,並不會告訴你爲什麼這是不好的做法。我很高興你能問這個問題。

事實是,在模型 - 視圖 - 控制器架構,視圖應該是可重複使用的,無論它們所包含的內容,因此,視圖和控制視圖的內容不應該是相同的對象。在iOS5之前,UIViewController究竟是如何實現的?Apple不鼓勵你在多次使用中使用它們,而這是一件非常合乎邏輯的事情。當然這是令人困惑的,許多人無視這些指導方針,無論如何,包括我自己在內,應用程序運行良好,並通過了應用商店驗證,這導致了更多的混淆。 結果是,直到今天,人們仍然在蘋果崩潰並給了我們自定義容器ViewControllers一年多之後提出問題。我已經看到人們經常用複雜的答案回答這個問題,至於重新創建UIViewController作爲一個從NSObject繼承的非常簡單的問題。只是因爲蘋果不鼓勵使用UIViewControllers,甚至不知道爲什麼。

由於將ViewController視圖添加爲子視圖通常可以很好地工作,並且ViewController遏制在許多人仍然支持的iOS4中不可用,因此太多人不會使用ViewController遏制。這是更乾淨的解決方案,當您想在ViewController中使用ViewController時,應儘可能使用ViewController。如果沒有,在大多數情況下,您應該能夠簡單地將ViewController的視圖添加爲子視圖,您只需知道在哪種情況下。

這裏是你期待什麼,如果你只需添加一個視圖控制器的看法,另一種觀點:不能保證

  • 查看回調方法被調用。諸如viewWillAppear,viewDidAppear,viewWillDisappear和viewDidDisappear之類的方法可能會也可能不會被調用。它在很大程度上取決於操作系統的版本,在iOS4中它們永遠不會被調用,在iOS5和更高版本中,它們大多會被調用。所以你不能重寫這些方法,因爲你不能依賴它們,你無法控制它們何時,如果或多少次被調用。
  • 唯一視圖回調方法,將始終得到正確叫法viewDidLoad中。
  • 旋轉回調不會被調用。根據你的情況,這可能是一件大事,或根本不重要。如果視圖的自動恢復掩碼足以重新定位並重新調整它,那麼你很好。如果沒有,你可以隨時在超級視圖的ViewController的循環回調被調用時做一個自定義的實現。
  • 你必須保持到ViewController自己的引用,否則它會立即得到釋放,而其視圖仍將受到它的父被保留。

我絕對不會鼓勵它,但我也不勸阻它。這是情景,如果你不再需要支持iOS4,那麼你可以避免它。但是,如果你牢記上面的列表,那麼它也不會造成任何傷害,並且你的應用程序將正常工作。

+0

+1「查看回調方法不保證能夠被調用」當我試圖找出爲什麼不調用回調函數時,我有一段有趣的時間。結果?我在一個'UINavigationController'裏有我的控制器,這個行爲很奇怪。 – Sulthan 2012-11-21 09:25:21

0

你可能會得到它,但可能有更好的方法。認爲兩者都試圖操縱觀點似乎是合理的。我的回答是否定的。

你想完成什麼?

+0

我不要求任何特定的目的。但爲什麼你不建議這個? – Krishnan 2012-02-23 09:33:06

+0

你錯了,這是兒童視圖控制器的重點。 – Sulthan 2012-02-23 10:44:33

0

當然,您可以將UIViewController的視圖添加到另一個UiViewController的視圖中,至少可以作爲類變量。但我無法理解此解決方案的最終目標。 我認爲這是一個不好的做法,因爲應用程序界面的複雜性在增加。

+1

他的意思是,可以用'addSubview:'添加視圖。什麼類變量與此有關? – mattjgalloway 2012-02-23 08:56:17

3

有時沒關係,有時候不是。沒有顯示一些圖並解釋視圖控制器層次結構和視圖層次結構之間的關係,很難給出更好的答案。

幸運的是,蘋果已經做到了。請觀看WWDC 2011的「實施UIViewController Containment」視頻,以獲取何時可以使用以及何時不可使用的詳細說明。

0

通常在模型 - 視圖 - 控制器體系結構中,我們可以重用視圖。

但是對於UIViewController,它可能並不總是好主意。這可能會使項目體系結構變得複雜,因爲按照Apple文檔,視圖與視圖控制器緊密相連,所以它可能不易管理。

來自UIViewController的引用: 視圖控制器與他們管理的視圖緊密綁定,並參與用於處理事件的響應器鏈。視圖控制器是UIResponder類的後代,並且被插入受管根視圖與其超視圖之間的響應器鏈中,該視圖通常屬於不同的視圖控制器。如果視圖控制器的視圖不處理事件,則視圖控制器可以選擇處理該事件,也可以將事件傳遞給超級視圖。

但是,我認爲如果兩個不同控制器的用戶界面存在細微差別,我們可以重用視圖。

1

這實際上是一個複雜的視圖層次結構的常見情況。由於iOS 5,UIViewController使您可以添加子視圖控制器。當您添加子控制器時,您還將子視圖添加到控制器的視圖中。

另一方面,您不應該將視圖控制器的視圖添加到另一個視圖控制器而不將其添加爲子視圖控制器。

但是,不要濫用它。你應該這樣做時

  • 你(你自己喜歡的UINavigationControllerUISplitViewController東西)實現了一組控制器的容器
  • 孩子控制器是獨立的。如果兒童控制器不斷地調用其父對象的方法,反之亦然,那麼在一個控制器中實現該功能將是一個更好的主意。
相關問題