web-dev-qa-db-fra.com

iOS: Avertissement "tentative de présentation de ViewController dont la vue ne se trouve pas dans la hiérarchie des fenêtres"

Je reçois un avertissement lorsque je tente de présenter un ActivityController sur le contrôleur de navigation,

Attempt to present <UIActivityViewController: 0x15be1d60> on <UINavigationController: 0x14608e80> whose view is not in the window hierarchy!

J'ai essayé de présenter le contrôleur de vue en suivant le code,

UIActivityViewController * activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities];
    activityController.excludedActivityTypes = excludeActivities;

    UIViewController *vc = self.view.window.rootViewController;
    [vc presentViewController: activityController animated: YES completion:nil];

    [activityController setCompletionHandler:^(NSString *activityType, BOOL completed) {
        NSLog(@"completed");

    }];

Qu'est-ce qui ne va pas ici?

39
iOSNoob

Vous essayez de présenter un contrôleur de vue à partir de rootViewController. Dans votre cas, je pense que le rootViewController n'est pas le ViewController actuel. Vous avez présenté ou ajouté un nouveau UIViewController. Vous devez présenter un contrôleur de vue à partir du contrôleur de vue le plus élevé.

Vous devez changer:

UIViewController *vc = self.view.window.rootViewController;
[vc presentViewController: activityController animated: YES completion:nil];

à:

[self presentViewController: activityController animated: YES completion:nil];
34
Midhun MP

Analyse: La classe ViewController de la vue modale actuelle n’a pas été chargée dans la fenêtre. Ceci est équivalent au bâtiment, le deuxième étage n’a pas été construit, allez directement sur 3 étages, ce n’est certainement pas le cas. Seulement après avoir chargé la vue de ViewController;

Python

- (void)viewDidAppear:(BOOL)animated {

 [super viewDidAppear:animated];

    [self showAlertViewController];

}

- (void)showAlertViewController {

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Hello world" message:@"(*  ̄3)(ε ̄ *)d" preferredStyle:UIAlertControllerStyleAlert];

    // Create the actions.

    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"hello" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
        NSLog(@"The \"Okay/Cancel\" alert's cancel action occured.");
    }];

    UIAlertAction *otherAction = [UIAlertAction actionWithTitle:@"world" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        NSLog(@"The \"Okay/Cancel\" alert's other action occured.");
    }];

    // Add the actions.
    [alertController addAction:cancelAction];
    [alertController addAction:otherAction];

    UIWindow *windows = [[UIApplication sharedApplication].delegate window];
    UIViewController *vc = windows.rootViewController;
    [vc presentViewController:alertController animated: YES completion:nil];
}

Cela a fonctionné pour moi.

6
qingsong

Remplacer la ligne:

UIViewController *vc = self.view.window.rootViewController;
[vc presentViewController: activityController animated: YES completion:nil];
//to
[self presentViewController:activityController animated: YES completion:nil];

ou

[self.navigationController pushViewController:activityController animated:YES];
3