Подтвердить что ты не робот

IOS: предупреждение "попытка представить ViewController, чей вид не находится в иерархии окон"

Я получаю следующее предупреждение, когда пытаюсь представить ActivityController на контроллере навигации,

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

Я попытался представить контроллер представления, следуя коду,

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");

    }];

Что здесь происходит?

4b9b3361

Ответ 1

Вы пытаетесь представить контроллер вида из rootViewController. В вашем случае я думаю, что rootViewController не является текущим ViewController. Либо вы представили, либо нажали новый UIViewController поверх него. Вы должны представить контроллер вида из самого верхнего контроллера.

Вам нужно изменить:

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

в

[self presentViewController: activityController animated: YES completion:nil];

Ответ 2

Анализ: Поскольку текущий класс ViewController для модального вида не загружен в окно. Это эквивалентно зданию, второй этаж еще не построен, прямо на крышу 3 этажа, это определенно нет. Только после просмотра 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 cancel action occured.");
    }];

    UIAlertAction *otherAction = [UIAlertAction actionWithTitle:@"world" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        NSLog(@"The \"Okay/Cancel\" alert 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];
}

Это сработало для меня.

Ответ 3

Заменить строку:

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

или

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

Ответ 4

Я столкнулся с аналогичной проблемой в iPhone 6+.

В 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)

Я решил это таким образом.