2011-05-19 71 views
1

情況:應用的UI基於UISplitView,在左側和右側有兩個UINavigationController s。在UINavigationController中嵌入了幾個自定義視圖及其對應的UIViewControlleriPad:UISplitViewController中控制器層次結構的設計模式?

一些可能的方法:class documentation建議使用delegate S,子視圖之間進行通信也如在this excellent tutorial證明。如果這是在自定義視圖的級別上完成的(在Apple的模板和Ray的教程中,每個UINavigationController內部都會這樣做),它最終會變得乏味,因爲需要委託來處理所有可能的視圖控制器組合。因此,將每個UINavigationController分類並僅在這兩者之間建立委派似乎更好。然而,在這種情況下,導航控制器可能必須將信息轉發給它們不需要知道的子控制器 - 委託協議需要爲可能發生的各種事件提供方法,並且子類成爲高度特定於應用的子視圖的重複通信。正如在this post的回答中所建議的,還有兩種可能性:a)響應者鏈,和b)通知。

問題:什麼是處理這種情況的最佳設計模式?

回答

2

我在Cocoa with love上發現了一個很好的帖子。其中一個關鍵的想法是引入控制器對象,同時迭代地重構設計,直到每個類都有一個單一的目的。

將其應用於複雜的視圖層次結構時,我發現擁有更大層次的控制器和範圍有限的想法非常具有吸引力和實用性。最終的設計將在重構代碼的幾次迭代之後收斂。

實際應用:對於視圖控制器的從左到右的通信,委託 - 蘋果文檔中推薦的 - 實際上是最實用的。如果左視圖需要對正確的視圖做出響應(對於主/細節範例來說很少見),我已經使用KVO,因爲通常這些類型的更新也可能由模型對象觸發,KVO非常適合一對多溝通模式。我沒有看到控制器通信使用目標動作機制。

更新:我發現另一篇博客中,其上Cocoa is my girlfriend解決這種特殊情況下,也看到條目的註釋部分。這篇文章有點基礎,並沒有涵蓋更復雜的應用程序的工作流程,但對於查看這種設計的其他方法仍然有用。此外,還有一個tutorial by Ray Wenderlich,它討論了這樣一個設計,雖然有一個簡單的例子。