2014-09-07 3 views
1

J'utilise Segue modal (sans contrôleur de navigation) pour se déplacer entre viewController A et viewController B comme ceci:Objectif c - Détecte vue actuelle de appDelegate

viewA *first = [self.storyboard instantiateViewControllerWithIdentifier:@"viewA"]; 
[self presentViewController:first animated:YES completion:nil]; 

Et pour revenir en arrière:

[self dismissViewControllerAnimated:YES completion:nil]; 

Maintenant, je veux savoir à partir de AppDelegate si A ou B est la vue actuelle en ce moment. Le problème est quand je vérifie

[(AppDelegate *)[[UIApplication sharedApplication] delegate] window] 

la réponse est toujours vue A - le premier.

J'ai essayé de définir la vue actuelle chaque fois que je suis en utilisant Segue modal comme ceci:

viewA *first = [self.storyboard instantiateViewControllerWithIdentifier:@"viewA"]; 
    [self presentViewController:first animated:YES completion:^ 
{ 
[[(AppDelegate *)[[UIApplication sharedApplication] delegate] window] setRootViewController:first]; 
}]; 

Mais il causer quelques bugs (comme incapable d'utiliser « dismissViewControllerAnimated »), et il est impossible travailler comme ça dans toutes les sections d'un grand projet à plusieurs endroits.

Comment devrais-je travailler avec ça? Et comment devrais-je détecter la vue actuelle de manière plus appropriée?

Répondre

1

Comme il a été répondu here

UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) { 
    return win1.windowLevel - win2.windowLevel; 
}] lastObject]; 

UIView *topView = [[topWindow subviews] lastObject]; 

Toutefois, cette logique semble ici comme mauvaise architecture. Quelle est la raison pour laquelle vous avez besoin de savoir quelle vue est actuellement présentée dans votre AppDelegate?

Modifier Il semble que vous souhaitiez répondre à l'événement applicationWillResignActive à partir de votre contrôleur de vue. Utilisez quelque chose comme ça dans le contrôleur de votre jeu.

- (void) applicationWillResign { 
    NSLog(@"About to lose focus"); 
} 

-(void) viewDidLoad { 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(applicationWillResign) 
    name:UIApplicationWillResignActiveNotification 
    object:NULL]; 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 
    [[NSNotificationCenter defaultCenter] 
    removeObserver:self]; 
} 
+0

J'ai un jeu. La viewA est le menu principal et viewB est le jeu lui-même. Je souhaite mettre le jeu en pause chaque fois que l'application passe en arrière-plan (applicationWillResignActive). donc j'ai besoin de connaître la vue actuelle pour appeler la méthode de pause ou pas (parce que si je suis au menu principal ou quelque chose d'autre je n'ai pas besoin de l'appeler). c'est un des exemples. Dans toutes mes applications que je suis en utilisant uniquement Segue modal et quand j'ai besoin d'appeler des méthodes de la appDelegate, je dois savoir ce qui est la vue actuelle. Voici comment je travaille, mais peut-être que c'est faux.Donc, si je fais quelque chose de mal, je voudrais savoir :) –

+1

@AsiGivati ​​C'est une raison très réelle. Une meilleure solution est donnée [ici] (http://stackoverflow.com/questions/589598/how-to-react-to-applicationwillresignactive-from-anywhere). – michaelsnowden

+0

Génial! fonctionne parfaitement avec NSNotificationCenter :) –

0

La fenêtre appDelegate ne sera pas égale à l'un ou l'autre contrôleur de vue (viewControllerA ou viewControllerB). Vous pouvez demander à la fenêtre pour voir le contrôleur de vue racine ...

AppDelegate *appDelegate = [UIApplication sharedApplication].delegate; 

if (appDelegate.window.rootViewController == viewControllerA) { 
    // always true if you always start the app with viewControllerA 

... et vous pouvez demander à tout contrôleur de vue du contrôleur de vue, il a présenté ...

if (appDelegate.window.rootViewController.presentedViewController == viewControllerB) { 
    // will be true if viewControllerA has presented viewControllerB 

Mais ceci est un jeu difficile. Si, par exemple, viewControllerB présente un autre viewControllerC, la condition ci-dessus continuera d'être vraie. Voir la réponse @Eric here (pas la réponse acceptée) pour un moyen de trouver le plus haut vc en général.