37

Ich erhalte Warnung folgende wenn ich versuche, eine ActivityController auf Navigation-Controller zu präsentieren,iOS: Warnung „Versuch Viewcontroller, deren Ansicht zu präsentieren ist nicht in der Fensterhierarchie“

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

ich versucht habe View-Controller präsentieren durch folgenden 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"); 

    }]; 

Was läuft hier falsch?

+2

Verwenden Sie '[self presentViewController: activityController animiert: YES completion: nil];' –

+0

@Mithun MP: Ja. Hat funktioniert. Danke, Mann. :) – iOSNoob

Antwort

33

Sie versuchen, einen View-Controller aus der rootViewController zu präsentieren. In deinem Fall denke ich, dass der rootViewController nicht der aktuelle ViewController ist. Entweder hast du eine neue UIViewController darüber gelegt oder geschoben. Sie sollten einen View-Controller vom obersten View-Controller selbst präsentieren.

Sie müssen sich ändern:

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

zu:

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

Sie können die Methode verschieben, um einen anderen View-Controller aufzurufen, um ViewDidAppear anzuzeigen: –

+2

@TiagoAmaral: Die Frage des OP ist anders, Ihr Kommentar ist in diesem aktuellen Kontext nicht gültig. Auch wenn Sie diesen Code in ViewDidAppear einfügen, müssen Sie mehrere Fälle behandeln. viewWill/DidAppear-Methoden werden mehrere Male aufgerufen (etwa nachdem ein presentedViewController nach einer Warnung usw. beendet wird). Sie müssen also diese Fälle behandeln, wenn Sie diesen Code in viewDidAppear einfügen. –

+0

Was können wir tun, wenn wir mit der OpenUrl-Methode umgehen? –

6

Analyse: Da die vorliegende modale Ansicht Viewcontroller-Klasse wurde nicht in das Fenster geladen. Dies ist gleichbedeutend mit dem Gebäude, zweiter Stock haben nicht gebaut, gehen direkt auf 3 Etage zu decken, das ist definitiv nicht. Nur nach Ansicht von ViewController laden;

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

Dies ist für mich gearbeitet.

+1

Während dies eine Antwort auf die Frage ist, können Sie es weiter erklären? Diese Antwort ist nicht hilfreich, wenn sie von anderen Benutzern besucht wird. –

+0

Je nach dem Moment in der Lebensdauer der "präsentierenden" Ansicht versuchen Sie, den alertController darzustellen, während die Ansicht des "präsentierenden VC" noch nicht an das Fenster "angehängt" ist. Im Grunde funktioniert der Versuch, einen anderen View-Controller in ViewDidLoad darzustellen, nicht, während er in der ViewDidAppear-Methode perfekt funktioniert. – FredericK

3

ersetzen Linie:

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

oder

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

Vielen Dank Kumpel ...Ich hatte diese Antwort die ganze Zeit gesehen ... aber stellen Sie sicher, wenn Sie diesen Code in Ihrem größeren verwenden es aus der Hauptwarteschlange nicht von einer untergeordneten Warteschlange andernfalls Crashes passieren kann –

-7

Ich stand vor dem ähnliche Problem 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) 

Ich löste es auf diese Weise.