2011-03-23 71 views
2

如果我想用另一個應用程序的一個屏幕替換,但我不使用導航欄/ TabBar控制器,那麼我可以從窗口中刪除oldViewController.view並添加newViewController.view。就是這樣,現在newViewController會得到旋轉事件等等。iOS如何知道哪個視圖控制器應該處於活動狀態?

但是UIView沒有引用「它的」控制器,所以這怎麼可能,iOS知道它應該讓newViewController成爲一個活動的控制器? iOS是否有一些神奇的功能,它從內部引用控制器還是什麼?

UPDATE:

我想我被誤解了:我不問如何使一些視圖控制器活動之一 - 我知道。我只是好奇,我怎麼可能將某些視圖傳遞給UIWindow對象([window addSubview:view]),它以某種方式找到視圖控制器,儘管視圖不知道它的控制器。

+0

我認爲它的確如此。如果從視圖控制器向窗口添加第二個視圖,它將不會僅獲取第一個視圖中的旋轉事件。 – Joe 2011-03-23 14:43:30

回答

2

不幸的是,iOS只將事件發送到堆棧的第一個ViewController。例如,您可以嘗試在其他視頻的頂部展示一個新的視頻,它永遠不會旋轉。

如果你不使用導航欄/標籤欄控制器,你將不得不每次從Window添加和刪除,如果你魔杖有事件時,只保留一個。

1

您的應用程序的主UIWindow類將在其rootViewController屬性中設置視圖控制器。該控制器的視圖是應用程序的「主要」視圖。這通常在項目的主要.xib中設置。該視圖控制器將接收像「viewDidAppear」或「willRotateToInterfaceOrientation」通常的事件。如果您願意,您可以在自己的視圖之上放置自己的視圖,但是您需要自己管理這些事件。通常你不這樣做。您只需使用UINavigationController或UITabBarController作爲rootViewController並允許它們管理將事件發送到新的「推送」視圖控制器,或者使用「presentModalViewController」彈出視圖控制器。

+1

+1,但該屬性僅適用於SDK 4.0以後的版本。只需將主UIWindow的'rootViewController'屬性設置爲新的視圖控制器即可。它的視圖將被安裝爲「作爲窗口的內容視圖」(來自doc)。 – Jilouc 2011-03-23 15:06:03

+0

感謝有關rootViewController的信息,但這不是我的問題的答案。如果你做[window addSubview:view],那麼rootViewController會自動設置,儘管UIWindow對象應該不知道關於傳遞視圖的視圖控制器。我很好奇,如果這是一些內在的魔法或者我可能不瞭解的東西。 – broot 2011-03-23 16:00:31

3

你好我有和你一樣的問題。我想到了。

UIView派生自UIResponder。而UIView必須繼承UIResponder :: nextResponder。

它的默認實現返回視圖的視圖控制器(如果它沒有,這將是超級視圖)

所以,因此視圖可以看到它的控制器。這意味着窗口知道最上面的視圖,並且也是其控制器。

祝你好運。

相關問題