2011-05-28 47 views

回答

24

如果您的應用程序只有一個UIWindow(通常如此),如果該窗口的唯一子視圖是您的根控制器的視圖(也通常如此):

[randomChildView.window.subviews objectAtIndex:0]

或者您可以通過檢查view.superview遞歸爬出層次結構,直到找到超級視圖爲nil的視圖。

+0

我喜歡它。乾杯。 – dugla 2011-05-29 15:49:09

+2

你可能要仔細檢查一下你是否會發現「superview is nil」我試過了,並陷入了無限循環。 – finneycanhelp 2012-04-08 19:19:23

+0

攀登的替代方案只需要幾個微不足道的處理器週期,而且您不需要假設任何東西。我沒有得到一個無限循環。 – TJez 2013-11-08 13:54:37

11

這是一個微不足道的處理器時間去直接超視圖層次結構。我在我的UIView類中有這個。

- (UIView *)rootView { 
    UIView *view = self; 
    while (view.superview != Nil) { 
     view = view.superview; 
    } 
    return view; 
} 

swift3/4:

func rootSuperView() -> UIView 
{ 
    var view = self 
    while let s = view.superview { 
     view = s 
    } 
    return view 
} 
+1

你的方法總是返回'self.window' – DUzun 2014-09-12 22:40:23

+0

不,它會在層次結構中找到最高的UIView元素。當然,如果你只在self.window下的視圖上運行它,它只會返回self.window。 – TJez 2014-09-17 12:28:36