2011-10-28 25 views
6

He creado un controlador de vista contenedor personalizado utilizando la new UIViewController container view controller methods en IOS 5.Problema con modales Ver Controladores y definesPresentationContext

El problema es que, a pesar de mi controlador de contenedor secundario UIViewController tiene definesPresentationContext = YES, cuando creates and presents another modal view controller, UIKit establece el contenedor (en lugar del niño) como el controlador que presenta.

Por ejemplo, en MyChildViewController.m:

- (void)showMailComposeView:(id)sender { 

    __block MFMailComposeViewController *vc = 
      [[MFMailComposeViewController alloc] init]; 
    vc.mailComposeDelegate = self; 
    vc.subject = @"Subject"; 

    self.definesPresentationContext = YES; 

    [self presentViewController:vc animated:YES completion:^{ 

     if ([self.modalViewController isEqual:vc]) 
      NSLog(@"This should print..."); 

     if ([vc.presentingViewController isEqual:self.parentViewController]) 
      NSLog(@"... but this shouldn't"); 

     // NOTE: Both log statements printed 

    }]; 
} 

- (void)mailComposeController:(MFMailComposeViewController*)controller 
      didFinishWithResult:(MFMailComposeResult)result 
         error:(NSError*)error 
{ 
    [self dismissViewControllerAnimated:YES completion:^{}]; 

    // NOTE: self.parentViewController.view now displays instead of self.view 
} 

Dónde estoy haciendo mal?

¿Cómo me aseguro de que sea hijo vista que se revela cuando la vista modal se descarta (en lugar de la vista de contenedor)?

Respuesta

17

añadir esta línea antes de presentar el controlador de vista:

vc.modalPresentationStyle = UIModalPresentationCurrentContext 

Si usted ha hecho todos los padres e hijos cosas correctas todo el camino hasta la cadena de controlador de vista, esto hará que el punto de vista presentado para reemplazar el La vista de MyChildViewController y luego la vista de MyChildViewController volverán cuando la vista presentada sea descartada.

Ah, y olvidé mencionar, incluso entonces esto funcionará solo en el iPad. Una vista de controlador de vista presentada siempre ocupa toda la pantalla en iPhone, siempre se presenta desde la vista raíz.

EDITAR: A partir de iOS 8, esta característica también está disponible en el iPhone. (Y también lo son los popovers y las vistas divididas; básicamente, la mayoría de las declaraciones de la forma "solo en iPad" se convirtieron en falsas con iOS 8, que en mi opinión son noticias increíbles.)

+0

Aunque mi pregunta/problema era un poco diferente, esta ¡trabajó para mi! ¡Gracias! – chadbag

+0

Lo mismo aquí. ¡Gracias por esto! – Robert

+2

Interesante en cuanto a por qué en un iPhone, modal siempre es desde la vista raíz. Tengo una situación de contenedor similar en el iPhone y al hacer todo lo anterior, me preguntaba por qué la vista modal no se presentaba dentro de los límites de la vista del controlador de vista infantil. Parece que esto es solo un comportamiento del iPhone que es diferente al iPad. – idStar

Cuestiones relacionadas