37

otrzymuję następujące ostrzeżenie przy próbie przedstawienia ActivityController na kontroler nawigacyjny,iOS: Ostrzeżenie „próba przedstawienia ViewController którego widok nie jest w hierarchii okien”

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

starałem się przedstawić widok kontrolera poniższym kodem,

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

    }]; 

Co tu jest nie tak?

+2

Użyj '[self presentViewController: activityController animated: YES completion: nil];' –

+0

@Mithun MP: Tak. Pracował. Dzięki. :) – iOSNoob

Odpowiedz

33

Próbujesz przedstawić kontroler widoku od rootViewController. W twoim przypadku myślę, że rootViewController nie jest bieżącym ViewController. Albo pokazałeś lub nacisnąłeś na nim nowy UIViewController. Powinieneś przedstawić kontroler widoku z samego kontrolera widoku.

trzeba zmienić:

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

do:

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

Możesz przenieść metodę, aby zadzwonić do innego kontrolera widoku, aby wyświetlićDidAppear: –

+2

@ TiagoAmaral: Pytanie OP jest inne, Twój komentarz nie jest ważny w tym kontekście. Również jeśli umieszczasz ten kod w viewDidAppear, musisz obsłużyć kilka przypadków. Metody viewWill/DidAppear będą wywoływane kilka razy (np. po tym, jak przedstawionyViewController zwalnia, po usunięciu alertu itp.). Musisz więc zająć się tymi przypadkami, jeśli umieścisz ten kod w viewDidAppear. –

+0

co możemy zrobić, gdy używamy metody openUrl? –

6

Analiza: Ponieważ obecny widok modalne klasa ViewController nie został załadowany do okna. To jest odpowiednik budynku, drugie piętro nie zbudowane, bezpośrednio przejdź na 3 piętro, to zdecydowanie nie jest. Tylko po załadowaniu 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]; 
} 

ten pracował dla mnie.

+1

Chociaż jest to odpowiedź na pytanie, czy możesz wyjaśnić to dalej? Ta odpowiedź nie będzie przydatna, gdy odwiedzą ją inni użytkownicy. –

+0

W zależności od czasu w "prezentowaniu" widoku kontrolera widoku, próbujesz przedstawić alertController, podczas gdy widok "prezentującego VC" nie jest jeszcze "dołączony" do okna. Zasadniczo próba przedstawienia innego kontrolera widoku w ViewDidLoad nie będzie działać, a będzie działać doskonale w metodzie ViewDidAppear. – FredericK

3

Zamień linię:

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

lub

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

Dziękuję bardzo kolego ...widziałem tę odpowiedź od samego początku ... ale upewnij się, że używaj tych kodów w większym użyciu z głównej kolejki, a nie z kolejki podrzędnej, w przeciwnym razie może dojść do awarii –

-7

I w obliczu podobnego problemu w 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) 

że rozwiązany w ten sposób.

Powiązane problemy