iOS: Warning "attempt to present ViewController whose view is not in the window hierarchy"
M

4

39

I am getting following warning when I try to present a ActivityController on navigation controller,

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

I have tried to present view controller by following 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");

    }];

Whats going wrong here ?

Mulvaney answered 7/2, 2015 at 6:31 Comment(2)
Use ` [self presentViewController: activityController animated: YES completion:nil];`Ilmenite
@Mithun MP: Yes. Worked. Thanks man. :)Mulvaney
I
35

You are trying to present a view controller from the rootViewController. In your case I think the rootViewController is not the current ViewController. Either you presented or pushed a new UIViewController on top of it. You should present a view controller from the top most view controller itself.

You need to change:

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

to:

[self presentViewController: activityController animated: YES completion:nil];
Ilmenite answered 7/2, 2015 at 8:3 Comment(3)
You can move the method to call another view controller to viewDidAppear:Bucaramanga
@TiagoAmaral: The OP's question is different, your comment is not valid in this current context. Also if you are putting that code in viewDidAppear, you need to handle several cases. viewWill/DidAppear methods will be invoked several time (like after a presentedViewController dismisses, after an alert dismisses etc). So you need to handle these cases, if you put that code in viewDidAppear.Ilmenite
what can we do when handling openUrl method?Whomp
P
6

Analysis: Because the present modal view ViewController class has not been loaded into the window. This is equivalent to the building, second floor haven't built, directly go to cover 3 floor, this is definitely not. Only after load ViewController's view ;

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];
}

This's worked for me.

Prindle answered 24/5, 2016 at 8:55 Comment(2)
While this is an answer to the question, could you explain it further? This response won't be useful when visited by other users.Decaffeinate
Depending on the moment in the "presenting" view controller life, you are trying to present the alertController while the view of the "presenting VC" is not yet "attached" to the window. Basically, trying to present another view controller in the ViewDidLoad won't work, while it will work perfectly in the ViewDidAppear method.Fanaticize
S
3

Replace line:

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

or

[self.navigationController pushViewController:activityController animated:YES];
Semi answered 25/5, 2016 at 7:29 Comment(1)
Thanks a lot buddy... i had seen this answer all along...but make sure when you use these code in your bigger use it from main queue not from any child queue otherwise crashses may happenBegat
T
-6

I faced the similar issue in iPhone 6+.

In Swift 2.0

let obj = self.storyboard?.instantiateViewControllerWithIdentifier("navChatController") as! UINavigationController
obj.modalPresentationStyle = .FormSheet
obj.modalTransitionStyle = .CoverVertical

Constants.APPDELEGATE.window?.rootViewController?.presentViewController(obj, animated: false, completion: nil)

I solved it by this way.

Tallou answered 7/6, 2016 at 4:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.