2011-04-20 70 views
0

在很多應用程序中,我寫了很多次,我不得不從某些類沒有參考當前可見控制器的模態中呈現控制器。 (例如,呈現用於顯示產品的下載進度的控制器的StoreKit交易觀察者)。什麼是從任何地方呈現UIViewController的推薦方式?

With Three20,我可以使用- [TTNavigator visibleViewController]來完成工作,但如果我不想使用框架呢?我應該重新實現一個像TTNavigator那樣的自定義函數嗎? Apple API中可能有類似的方法嗎?例如,爲我的應用程序中的所有控制器創建一個通用的父類,然後使用NSNotificationCenter來處理所有應用程序範圍內的通知,會更好嗎? (這當然會有在一個類中具有不相關代碼的副作用)

我真的很驚訝蘋果沒有在他的標準API中提供這個基本功能。或者,這個問題對我來說反覆出現的事實是一個糟糕的設計實踐的跡象?

回答

1

一些想法,不一定保證是正確的,但也許會讓你朝正確的方向發展:如果我正確地理解你的問題,基本上你有一些具體的行動,在某些時候(比如完成時)需要顯示一個模式視圖,但是所述操作沒有對當前在屏幕上的視圖控制器的引用(例如,也許你正在後臺執行任務,並讓用戶仍然瀏覽您的程序,並且要提醒用戶完成)。

我想你將如何解決這個問題將取決於你的應用程序的整體架構。大多數應用程序都會有一些控制導航的根視圖控制器:或許您已在應用程序委託中創建了UITabBarController,並且所有導航都從該控制器中脫離出來。你可以通過這個頂層的視圖控制器顯示你的模式視圖控制器(你可能會在你的應用程序委託中這樣做)。

或者,您可以放棄顯示模式視圖控制器的想法,並將視圖直接附加到您的應用程序窗口。如果你看看一個相當受歡迎的圖書館,如MBProgressHUD,你會看到你可以附加提供給應用程序窗口的模態加載視圖,其中所有視圖控制器都位於該窗口中。

所以有很多不同的策略來實現你想要的。我不一定會說你的問題是一個糟糕的應用程序設計的結果,因爲有些情況下你可能想要顯示一些模式對話框而不知道當前可見的視圖控制器。也就是說,在您給出的例子中 - 一個顯示下載進度的StoreKit事務觀察器 - 人們會認爲它會在離散操作(例如購買產品)後觸發,並且您會知道從哪個視圖控制器觸發。

+0

謝謝你的詳細解答。在App Delegate中,我確實有一個對根視圖控制器的引用(通過主窗口)。但是它仍然不能讓我立即獲得當前可見的控制器,因爲目前可能存在模態控制器,導航堆棧可能更復雜。至於我給出的例子,現在我按照你所說的處理問題:雖然蘋果不贊成這樣做,但我將商店控制器設置爲交易的觀察者,因爲應用程序完成啓動後應儘快處理未完成的事務。 – eugeniodepalo 2011-04-20 10:11:24

+0

嗯,好的 - 我沒有考慮過你已經顯示模態控制器的可能性(即模態內的模態)。如果是這種情況,最簡單的方法可能就是覆蓋窗口並將其轉儲到整個應用程序視圖層次結構的頂部。 – lxt 2011-04-20 11:27:53

相關問題