2010-09-14 5 views
20

Come posso ottenere la vista attualmente attiva (la vista principale attualmente visualizzata dall'utente) dal delegato dell'app per l'amor di riferimento?Come ottenere la vista attiva in un'applicazione iOS dal delegato dell'app?

+0

Definire "vista principale". Potrebbero esserci diversi sullo schermo contemporaneamente oggetti 'UIView' (e sottoclassi) sullo schermo. Quale ti aspetteresti di ottenere? –

+0

Supponiamo che l'utente sia attualmente su una schermata per eseguire un'azione specifica, voglio ottenere il viewcontroller per la vista del contenitore per quella schermata – David

+0

Dovrai tenerne traccia da solo. Come le viste, potrebbero essere attivi più di un controller di visualizzazione sullo schermo. –

risposta

9

Dipende da come è stata configurata la tua app.

In genere, il delegato dell'app dispone di una proprietà del controller della vista principale che consente di raggiungerla.

Per ottenere la vostra applicazione delegato

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

UIView *topView = appDelegate.viewController.view; 

Se la vostra applicazione ha una proprietà controller di navigazione in app delegato si può fare qualcosa di simile.

UIView *topView = appDelegate.navigationController.topViewController.view; 
+0

La terza riga mi dà un errore: Proprietà 'navigationController' non trovata su oggetto di tipo 'kzAppDelegate' – zakdances

+0

probabilmente non stai usando un controller di navigazione allora. Guarda la seconda riga di codice nella mia risposta. – Randall

+0

Non funziona con le visualizzazioni modali! – skywinder

0

è possibile utilizzare [appDelegate.navigationController.topViewController class] per registrare la classe del controller o ottenere la proprietà titolo per sapere quale sia.

0

Spero che questo ti aiuta

UINavigationController *navCnt = (UINavigationController *)self.window.rootViewController; 

if([navCnt.topViewController isMemberOfClass:[WebViewController class]]) 
{ 
    return UIInterfaceOrientationMaskAll; 
} 
else 
return UIInterfaceOrientationMaskPortrait; 
32
UIWindow *window = [[UIApplication sharedApplication] keyWindow]; 
UIView *topView = window.rootViewController.view; 
+1

Non funziona con le visualizzazioni modali! – skywinder

0

Ovunque nel applicazione è possibile ottenere il vostro RootViewController View piace anche:

id<UIApplicationDelegate> appDelegate = [[UIApplication sharedApplication] delegate]; 
UIView *rootView = appDelegate.window.rootViewController.view; 
+1

Non funziona con le visualizzazioni modali! – skywinder

14

Tutte le risposte migliori non funzionano col modale presentato visualizzazioni! Usa questo codice invece:

UIView * topView = [[[[UIApplication sharedApplication] keyWindow] subviews] lastObject];

+0

funziona per me, grazie :) –

1

Ho trovato questo e funziona benissimo per me per tutti i tipi di segues e visualizzare i controllori.

+ (UIViewController *) getTopController { UIViewController * topViewController = [UIApplication sharedApplication] .keyWindow.rootViewController;

while (topViewController.presentedViewController) { 
    topViewController = topViewController.presentedViewController; 
} 

return topViewController; 

}

0

Prova Eric's answer:

+ (UIViewController*) topMostController 
{ 
    UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController; 

    while (topController.presentedViewController) { 
     topController = topController.presentedViewController; 
    } 

    return topController; 
} 
Problemi correlati