簡體   English   中英

是否可以將UIViewController的視圖添加到另一個UIViewController的視圖中?

[英]Is it advisable to add a UIViewController's view to another UIViewController's view?

是否可以將UIViewControllerview添加到另一個UIViewControllerview

請解釋為什么這是一個好的做法或一個不好的做法。

蘋果公司以及大多數遵循Apple指南的人都會告訴你這是不好的做法,因此Apple添加了ViewController包含(childViewControllers)。 不幸的是,大多數人盲目地遵循這一點,並不會告訴你為什么這是不好的做法。 而且我很高興你這么做。

事實上,在模型 - 視圖 - 控制器體系結構中,視圖應該是可重用的,無論它們包含什么內容,因此視圖和控制視圖內容的對象不應該相同。 這正是UIViewController在iOS5之前所做的事情Apple不鼓勵你多次使用它們,而這是非常合乎邏輯的事情。 當然這很令人困惑,許多人忽略了指導方針,無論如何都做了,包括我自己,應用程序工作正常並通過了應用商店驗證,這引起了更多的混亂。 結果是,直到今天,人們仍然在Apple塌陷並給我們自定義容器ViewControllers一年多后就此問題。 我已經看到人們經常使用復雜的答案來回答這個問題,只要將UIViewController重新創建為一個繼承自NSObject的類來解決非常簡單的問題。 僅僅因為Apple不鼓勵使用UIViewControllers,甚至不知道為什么。

由於將ViewController的視圖添加為子視圖通常可以很好地工作,並且iOS4中仍然沒有ViewController包含,許多人仍然支持,太多人不打擾使用ViewController包含。 這是更清潔的解決方案,當您想在ViewControllers中使用ViewControllers時,您應該盡可能使用它。 如果沒有,在大多數情況下,您應該能夠簡單地將ViewController的視圖添加為子視圖,您只需知道在哪些情況下。

如果您只是將ViewController的視圖添加到另一個視圖,那么您可以期待以下內容:

  • 查看回調方法不能保證被調用。 viewWillAppear,viewDidAppear,viewWillDisappear和viewDidDisappear等方法可能會被調用,也可能不會被調用。 它在很大程度上取決於操作系統版本,在iOS4中它們永遠不會被調用,在iOS5及以上版本中,它們通常會被調用。 所以你不能覆蓋這些方法,因為你不能依賴它們,你無法控制它們被調用的時間,次數或次數。
  • 始終被正確調用的唯一視圖回調方法是viewDidLoad。
  • 旋轉回調不會被調用。 根據您的情況,這可能是一個大問題或根本不重要。 如果視圖的autoresizingmask足以重新定位並重新縮放它,那么你就沒事了。 如果沒有,您可以在調用superview的ViewController的旋轉回調時始終執行自定義實現。
  • 您必須自己保留對ViewController的引用,否則它將立即釋放,而其視圖仍將由其superview保留。

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

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

幸運的是,Apple已經做到了。 觀看WWDC 2011中的“實現UIViewController遏制”視頻,詳細說明何時可以,何時不可以。

這實際上是復雜視圖層次結構的常見情況。 從iOS 5開始, UIViewController允許您添加子視圖控制器。 添加子控制器時,還要將子視圖添加到控制器的視圖中。

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

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

  • 您正在為一組控制器實現容器(類似於您自己的UINavigationControllerUISplitViewController
  • 子控制器是獨立的。 如果子控制器不斷地在其父控制器上調用方法,那么將功能實現到一個控制器中會更好。

你可能會逃脫它,但可能有更好的方法。 認為兩者都試圖操縱視圖似乎是合理的。 我的回答是否定的。

你想達到什么目的?

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

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

但是對於UIViewController,它可能並不總是好主意。 它可能會使項目架構變得復雜,因為根據Apple文檔視圖與視圖控制器緊密綁定,因此它可能不容易管理。

從UIViewController引用:視圖控制器與它們管理的視圖緊密綁定,並參與用於處理事件的響應器鏈。 視圖控制器是UIResponder類的后代,並插入到托管根視圖與其超級視圖之間的響應程序鏈中,后者通常屬於不同的視圖控制器。 如果視圖控制器的視圖不處理事件,則視圖控制器可以選擇處理事件,也可以將事件傳遞給superview。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM