ios objective-c uiactivityviewcontroller presentviewcontroller uiview-hierarchy

iOS: advertencia "intento de presentar ViewController cuya vista no está en la jerarquía de la ventana"



objective-c uiactivityviewcontroller (4)

Análisis: debido a que la vista modal actual de la clase ViewController no se ha cargado en la ventana. Esto es equivalente al edificio, el segundo piso no se ha construido, vaya directamente a cubrir 3 pisos, esto definitivamente no es así. Solo después de cargar la vista de ViewController;

Pitón

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

Esto funcionó para mí.

Recibo una advertencia cuando intento presentar un ActivityController en el controlador de navegación,

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

Intenté presentar el controlador de vista siguiendo el código,

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á mal aquí?


Enfrenté el problema similar en iPhone 6+.

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

Lo solucioné de esta manera.


Está tratando de presentar un controlador de vista desde el controlador rootViewController . En su caso, creo que el rootViewController no es el ViewController actual. O bien presentó o presionó un nuevo UIViewController encima. Debe presentar un controlador de vista desde el controlador de vista superior.

Necesitas cambiar:

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

a:

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


Reemplazar línea:

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

o

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