2010-03-11 52 views
18

我正試圖將我的頭圍繞可可觸摸控制器。主要問題是我想同時在屏幕上顯示一個以上的控制器 - 我想擁有一個由較小視圖組成的較大視圖(控制器A),它們由自己的控制器(如B)控制。我想這樣做,因爲該部門使代碼更清潔。有什麼不好的是,額外的控制器(類型B)不是屏幕上的「頭等公民」,例如他們沒有收到自動查詢和通知。 (並且不能容易地顯示模式控制器,他們必須將presentModal…消息發送給它們的父控制器。)立即在屏幕上顯示多個視圖控制器?

Cocoa觀點的A和B控制器之間有什麼區別?系統是否保留了某種指向「最前面的控制器」的指針,這是一個特權發送通知和類似的東西?爲什麼其他控制器不能接收它們,即使它們的視圖在屏幕上? 「屏幕上」有多個控制器被認爲是黑客?還是支持,我只是缺少一點?謝謝。


更多關於我想解決的問題:我正在寫一個簡單的照片瀏覽器。照片以全屏顯示,用戶可以向左或向右滑動以更改照片。 A控制器負責滾動部分,B控制器負責照看每張照片本身。

隔離乙似乎是個好主意,因爲這些照片是從網絡加載,有很多可能發生,就像網絡可能會下降等等。在B控制器中,代碼非常簡單,因爲B僅適用於一張特定照片。如果我將代碼移到A控制器,事情會變得混亂。

我不喜歡目前的解決方案的唯一的事情是,我必須手動解決乙不是一個「一流」的控制器。我必須通過A手動傳遞一些呼叫到B,當B想要顯示一個模式對話時,它必須發送presentModal…給A.這很醜陋。

回答

7

首先,和,鑑於控制器沒有得到「在屏幕上」這是很重要的 - 意見做。您的「頂級」控制器當然可以將您所描述的各種消息傳遞給其「子視圖控制器」。事實上,這是大多數應用程序的工作原理。考慮一個具有標籤欄的應用程序,以及視圖使用導航控制器的位置。實際上,你有幾個視圖控制器「跑」的同時,每個屏幕上的自己的看法,在一次 - 的UITabBarController,然後有幾個嵌套UINavigationControllers你的「根」視圖控制器將是一個實例(或子類)的每個,它將顯示嵌套視圖控制器(如實例或UITableViewController的子類)。

你可能需要閱讀了關於如何responder chains工作位。考慮觸摸事件。它將爲最靠近堆棧頂部的視圖生成,該視圖可以接收事件,該事件也位於水龍頭下方。如果這個觀點無法處理它,那麼它就會被視爲層級食物鏈,直到有人處理它(然後吃掉它)。

至於你的問題的細節,整體上,我不知道到底是什麼你所描述的策略是真的做你在複雜性方面獲益。這取決於你究竟是如何實現的,但是爲每個小的子視圖設置不同的視圖控制器可能需要更多的簿記代碼,而不是隻有一個視圖控制器知道其所有的子視圖組件。

+0

很好的回答,謝謝了良好的和詳細的解釋。我知道屏幕上顯示的是意見,而不是控制器,這就是爲什麼我一直在引用「屏幕上」,意思是「在屏幕上觀看」的原因。我會更詳細地寫出問題的情況。 – zoul 2010-03-11 10:12:57

12

這不是密切相關,原來的問題,但很重要。Apple在View Controller Programming Guide中明確指出,視圖控制器負責精確控制一個屏幕的內容:

「您創建的每個自定義視圖控制器對象都負責管理一個屏幕的內容值。視圖控制器和屏幕之間的對應關係是應用程序設計中非常重要的考慮因素,不應該使用多個自定義視圖控制器來管理同一個屏幕的不同部分,同樣,您不應該使用單個自定義視圖控制器對象管理多個屏幕的內容

注意:如果要將單個屏幕劃分爲多個區域並分別管理每個屏幕,請使用通用控制器對象(自定義對象de從NSObject中窺探)而不是視圖控制器對象來管理屏幕的每個子部分。然後使用單個視圖控制器對象來管理通用控制器對象。視圖控制器協調整個屏幕的互動,但根據需要通用控制器對象所管理的郵件轉發「

但是iPad的編程指南中他們也說有可能是容器視圖控制器:

」。視圖控制器負責一個單一的觀點。大多數情況下,視圖控制器的視圖預計會填充應用程序窗口的整個範圍。但是,在某些情況下,視圖控制器可能嵌入在另一個視圖控制器(稱爲容器視圖控制器)內並與其他內容一起呈現。導航和標籤欄控制器是容器視圖控制器的例子。「

到我目前的知識我不會在視圖控制器中使用子視圖控制器,但嘗試子類NSObject並從我的主視圖控制器發送消息給他們。

還要檢查這個線程: MGSplitViewController discussion

+1

問題是如何將消息從通用NSObject控制器對象傳遞到視圖控制器。你需要委託或NSNotifications這是一個痛苦。 – mskw 2013-11-21 14:13:13

5

其實你可以把它比iOS 5的工作較早,至今。我們大多數人是ta同時使用4.x和5.x。我已經創建了一個可以同時運行的解決方案,並且效果很好,appstore中的應用程序很少使用它:)請參閱我爲此創建的my article about this或僅download and use a simple class

+0

蘋果公司在ios5之前這樣做是不好的做法(也就是在蘋果公司提供遏制之前)。蘋果工程師親自告訴我。 – ader 2012-02-28 11:51:13

+0

我一直在使用這個解決方案已經有一年多了,我從來沒有遇到任何問題。問題是我見過的大多數實現都沒有正確處理內存和所有重要的方法,而我的DOES正確地處理它。儘管我愛蘋果視圖控制器遏制應引入iPad的發佈,因爲這是多視圖控制器最常見的情況。再次,這是在appstore中的許多應用程序批准的解決方案。這個解決方案允許重複使用iPhone視圖控制器而不會有任何大驚小怪的問題。 – 2012-03-01 11:38:51

4

這是一個很老的問題,但是因爲我猜今天有些人可能會面臨同樣的問題,所以我想分享我的解決方案。 我正在編寫這個應用程序,這個屏幕有很多信息,分頁,控件等。由於根據Apple的MVC documentation對ViewControllers的作用,您不應該在視圖本身中實現邏輯,或者直接訪問數據模型從它,我不得不選擇具有幾千行代碼的Massive ViewController,這些代碼很難維護和調試(即使是單元測試),或者找到一種新方法。

我的解決辦法是使用UIContainerView象下面這樣: enter image description here

這種方式,你可以在它自己的視圖控制器實現各部分的邏輯,和父視圖控制器負責的觀點照顧約束和尺寸。

注:這個答案只是證實了這一方式的指導,你可以找到關於它如何工作以及如何實現它HERE

相關問題