2011-05-28 10 views

Respuesta

24

Si su aplicación sólo tiene una UIWindow (generalmente cierto), y aunque sólo sea vista secundaria de la ventana es la opinión de su controlador root (también suele ser cierto):

[randomChildView.window.subviews objectAtIndex:0]

O puede salir de la jerarquía de forma recursiva, marcando view.superview hasta que encuentre una vista cuya supervista es nil.

+0

me gusta. Aclamaciones. – dugla

+2

Es posible que desee comprobar que alguna vez encuentre que una "supervista es nula", lo intenté y me quedé atrapado en un ciclo infinito. – finneycanhelp

+0

La alternativa de escalar solo toma unos pocos ciclos de procesador insignificantes, y no necesita asumir nada. No entiendo un ciclo infinito. – TJez

11

Es una cantidad insignificante de tiempo de procesador para ir directamente a la jerarquía de Superview. Tengo esto en mi categoría 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

Su método siempre devuelve 'self.window' – DUzun

+0

No, encontrará el elemento UIView más alto en la jerarquía. Por supuesto, si solo lo ejecuta en vistas que están bajo self.window, solo devolverá self.window. – TJez

Cuestiones relacionadas