279 votes

iPhone--Comment trouver au premier plan vue contrôleur

J'ai couru dans quelques cas où il serait agréable d'être en mesure de trouver la "plus haute" - vue-contrôleur (le responsable de l'affichage actuel), mais je n'ai pas trouvé un moyen de le faire.

Fondamentalement, le défi est ceci: étant Donné que l'un est en cours d'exécution dans une classe qui n'est pas une-vue-contrôleur (ou d'une vue) [et ne pas avoir l'adresse d'une active view] et n'a pas été transmis à l'adresse de la supérieure-vue-contrôleur (ou, disons, l'adresse de la manette de navigation), est-il possible de trouver ce point de vue contrôleur? (Et, si oui, comment?)

Ou, à défaut, est-il possible de trouver le premier point de vue?

449voto

Eric Points 3061

Je pense que vous avez besoin d’une combinaison de la réponse acceptée et de @fishstix

151voto

kleo Points 588

Pour compléter de JonasG réponse (ce qui exclu les contrôleurs de barre d’onglet lorsque vous traversez), voici ma version de retourner le contrôleur de vue actuellement visibles :

81voto

Wilbur Vandrsmith Points 2809

iOS 4 a introduit la propriété RootViewController exchangeAddSubViewFor sur UIWindow :

Vous devrez définir vous-même après avoir créé la vue contrôleur cependant.

27voto

Rajesh Points 335

Pour compléter Eric réponse (qui a laissé de côté popovers, les contrôleurs de la navigation, tabbarcontrollers, vue contrôleurs ajouté que les sous-vues de certains autres contrôleurs de vue en traversant), voici ma version de retour actuellement visible-vue-contrôleur:

=====================================================================

// Dans AppDelegate.h

//Whenever you are creating any popover plz assign it to this variable.
@property (nonatomic, weak) UIPopoverController *currVisiblePopOver;

=====================================================================

// Dans AppDelegate.m

- (UIViewController*)topMostViewController {

   // Handling UIPopoverController
    if (self.currVisiblePopOver && [self.currVisiblePopOver isKindOfClass:[UIPopoverController class]] && [self.currVisiblePopOver isPopoverVisible])
    {
        return self.currVisiblePopOver.contentViewController;
    }
    else
    {
        return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
    }
}

- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
   // Handling UITabBarController
   if ([rootViewController isKindOfClass:[UITabBarController class]]) {
       UITabBarController* tabBarController = (UITabBarController*)rootViewController;
       return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
   }
   // Handling UINavigationController
   else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
       UINavigationController* navigationController = (UINavigationController*)rootViewController;
       return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
   }
   // Handling Modal views
   else if (rootViewController.presentedViewController) {
       UIViewController* presentedViewController = rootViewController.presentedViewController;
       return [self topViewControllerWithRootViewController:presentedViewController];
   }
   // Handling UIViewController's added as subviews to some other views.
   else {
       for (UIView *view in [rootViewController.view subviews])
       {
           id subViewController = [view nextResponder];    // Key property which most of us are unaware of / rarely use.
           if ( subViewController && [subViewController isKindOfClass:[UIViewController class]])
           {
               return [self topViewControllerWithRootViewController:subViewController];
           }
       }
       return rootViewController;
   }
}

=====================================================================

// En tout point de vue où nous sommes rejetant la liste

#pragma mark - UIPopoverControllerDelegate methods
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.currVisiblePopOver = nil;
    popoverController = nil;
}

// En tout point de vue où nous sommes montrant liste nous avons besoin d'avoir les 2 lignes où "popOverController' est le nom de l'instance de la UIPopoverController

popOverController.delegate = self;
[(AppDelegate *)[[UIApplication sharedApplication] delegate] setCurrVisiblePopOver:popOverController];

//---------- (exemple ci-dessous) ---------- //

- (IBAction)syncWarningsBtnAction:(id)sender
{
    SyncWarningsViewController *syncWarningsViewController = [[SyncWarningsViewController alloc] init];
    popOverController = [[UIPopoverController alloc] initWithContentViewController:syncWarningsViewController];

    popOverController.delegate = self;
    [(AppDelegate *)[[UIApplication sharedApplication] delegate] setCurrVisiblePopOver:popOverController];

    [popOverController presentPopoverFromRect:self.btnSync.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

}

=====================================================================

Et maintenant, tout ce que vous devez faire pour obtenir la meilleure plus-vue-contrôleur est d'appeler la méthode ci-dessus comme suit:

UIViewController *topMostViewControllerObj = [self topMostViewController];

12voto

ipodishima Points 138

J'ai reçu récemment cette situation dans mon projet, qui a tenu à afficher une notification de vue quel que soit le contrôleur affiche était et quel était le type (UINavigationController, manette classique ou personnalisé-vue-contrôleur), lorsque l'état du réseau a changé.

Donc j'ai juste sorti mon code, ce qui est assez facile et en fait basé sur un protocole, de sorte qu'il est flexible avec chaque type de conteneur contrôleur. Il semble être lié avec les dernières réponses, mais dans beaucoup de souplesse.

Vous pouvez saisir le code ici : PPTopMostController

Et a obtenu le plus haut du contrôleur à l'aide de

UIViewController *c = [UIViewController topMostController];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X