2010-09-23 106 views
8

Apple documentation給出了關於使用視圖控制器來管理屏幕的一部分的警告。Apple如何讓其控制器包含其他控制器?

注意:你不應該使用視圖控制器 管理的意見,填補 只有他們的窗口,也就是說, 只能由 應用內容矩形定義的區域的一部分的一部分。如果您想讓 有一個由 幾個較小視圖組成的界面,請將它們全部嵌入到單個根視圖中,並使用視圖控制器管理該視圖。

現在奇怪的是蘋果打破了這個建議。 UITabBarControllerUINavigationController,UISplitViewController都與此建議背道而馳。有關於Apple forums的討論,如果您忽略此建議,會出現什麼問題。

我發現tutorial關於如何做到這一點,但該方法有一個問題,overlapping the status bar有一個修復,似乎有點狡猾。其他問題有solutions that appear kind of dodgyadvise against doing it

因此,問題是蘋果使用什麼方法爲自己的控制器?

+0

您可以發佈鏈接到參考嗎?儘管它們填充或不填滿屏幕,但我總是爲小視圖創建viewController。想查看後果和良好做法,請張貼鏈接。 。 。 – 2010-09-23 08:45:52

+0

@Raj:我在我的問題頂部添加了一個鏈接 – Casebash 2010-09-23 23:16:48

回答

4

他們也說不使用autorelease池,但在他們的樣本中有autorelease陳述。堅持實用。純度應該略高於次要。

3

蘋果寫了UIKit,所以他們可以做他們喜歡的。

有很多的東西引擎蓋下發生:

  • 查看{意志,難道} {出現,消失}
  • 視圖旋轉(唉,頭痛)
  • UIViewControllerWrapperView,這有時是UIViewController.view的父級。或者其他的東西。
  • UIViewController.navigationController/tabBarController/parentViewController/modalViewController
  • Popovers很奇怪。我不知道他們是如何融入其中的。

如果你寫你自己的看法,你也許可以使用的UIViewController來控制他們 脫身,但不要指望所有的神奇行爲的UIKit給予一個「適當的」視圖控制器。

編輯:我可能不應該StackOverflow時,它遲到了。我的意思是這樣的:

如果視圖是由UIViewController控制的,視圖控制器應該存在於視圖控制器層次結構中(即像presentModalViewController:animated:這樣的函數)。這允許UIKit處理複雜的位。

當你使用類似[fooSubview addSubview:viewController.view]之類的東西時,UIKit可能不會做所有它應該做的事情。什麼保留viewController?如果有內存警告並且fooSubview被卸載,會發生什麼?

如果你設置了類似viewController.view.frame = (CGRect){{0,0},{320,480}}的東西,你也會遇到麻煩:UIViewController根據當前狀態/導航/選項卡/ etc欄設置框架。它可能會重新設置它,或者它可能會使用框架來決定如何佈置視圖控制器(我注意到了這種行爲;它很混亂)。如果你改變viewController.view.transform,在視圖旋轉中可能會發生奇怪的事情,因爲視圖變換是UIViewController用於定位的方式(以及狀態欄和一堆其他事物)。

只有一種很好的支持例外,我所知道的:

[window addSubview:viewController.view]; 
[window makeKeyAndVisible]; 

(事實上,你可以堅持viewController.view窗口內全窗口視圖裏面;我不知道這是如何工作的)

我覺得在OS 4.0+中你應該設置window.rootViewController = viewController來代替。

+0

Apple的控制器可以處理任何視圖 – Casebash 2010-09-23 04:21:46

相關問題