2012-08-16 41 views
6

您能否想到Apple爲什麼選擇將UIPopoverController作爲普通NSObject子類實現的特殊原因?對我來說,一個UIViewController子類將更有意義,以實現適當的UIViewController遏制。爲什麼UIPopoverController不是UIViewController的子類?

但也許有原因我沒有想到,爲什麼蘋果的明亮工程師做出了他們的選擇?

回答

3

我認爲這是因爲像UIAlertView一樣,它被呈現在一個新的UIWindow中,因此windowLevel屬性保證它呈現在所有內容上。

無論它是否在新的UIWindow中,就視圖控制器遏制而言,在UIPopoverController中顯示的視圖控制器中使用複雜的父子視圖控制器容器層次結構應該沒有問題。我對 Pillboxie至少有三個級別的嵌套查看控制器的一些popovers,沒有任何問題。

更新:我通過記錄示例項目中視圖層次結構的前三個級別的類來檢查層次結構,當彈出窗口可見時(如我的根視圖控制器有兩個UIButton),它如下所示: :

的窗口:

_SUBVIEW類:UIView的

___SUBSUBVIEW類:UIRoundedRectButton

_ _SUB SUBSUBVIEW CLASS:UIButtonLabel

___SUBSUBVIEW類:UIRoundedRectButton

_ _SUBSUBSUBVIEW類:UIButtonLabel

_SUBVIEW類:UIDimmingView

___SUBSUBVIEW類:_UIPopoverView

_ _SUBSUBSUBVIEW類:_UIPopoverStandardChromeView

_ _SUBSUBSUBVIEW類:UIView的

蘋果的文檔指出根視圖控制器在一個UIWindow視圖應該沒有兄弟姐妹的觀點被其他視圖控制器進行管理,因爲這些兄弟姐妹視圖控制器將不會收到旋轉事件(見here ,第二顆子彈)。

因此,如果Apple已經將UIPopoverController作爲UIViewController的子類,那麼它將不得不將其添加爲rootViewController的層次結構的子/子視圖。但是,如果根視圖控制器(無論如何是代碼)決定呈現一個干擾UIPopoverController視圖層次結構的視圖?似乎蘋果決定完全管理UIPopoverController的表現,而不是讓他們自己對UIWindow的無兄弟視圖控制器策略給予例外。

+0

彈出窗口顯示在需要使'passthroughViews'工作的窗口中。對於視圖控制器遏制,我的意思是說,對於彈出窗口的根視圖控制器,「parentViewController'(可能沒有嘗試過)沒有定義。遏制內容視圖控制器的各個層次的課程作品,但這不是我的觀點。 – 2012-08-16 12:20:46

+0

您更新的答案很有意義。它必須位於根視圖控制器的視圖層次結構之外,以避免修剪視圖出現問題。因此它不能成爲UIViewController包含層次結構的一部分。 – 2012-08-16 14:28:10

0

因爲UIPopoverController的對象不與用戶進行交互,這就是爲什麼它是不是查看層的一部分,你的UIViewController能夠與用戶進行溝通,該UIPopoverController沒有做內部本身的任何類似的工作。

我們快速瀏覽一下該控制器的通用definition

控制器可以發送命令到其關聯的視圖改變 視圖的模型的演示(例如,通過一個 滾動文件)。它可以向模型發送命令以更新模型的狀態(例如編輯文檔)。

它解釋了爲什麼它不是查看層,我希望它能幫助的一部分。

+0

這並不能說服我。當用戶點擊內容外時,它肯定會與用戶進行交互。或者當縮小視圖以容納鍵盤等。 – 2012-08-16 14:25:32

+0

用戶**不能**解除彈出,程序員(你)只能做到這一點。 – holex 2012-08-16 16:36:11

+0

當然用戶可以關閉它,只需點擊彈出窗口外的屏幕即可。 – 2012-08-18 10:38:56

相關問題