2010-09-26 17 views
7

Quiero agregar una vista de confirmación después de que el usuario toma una foto o selecciona una foto guardada. La vista de confirmación solo mostrará la imagen seleccionada, con un botón para cancelar y cargar en una barra de herramientas.Presenta otra vista modal de UIImagePickerController

Mi UIImagePickerController se presenta de forma modal desde uno de mis controladores de vista, que está controlado por un controlador de navegación, que a su vez está controlado por un controlador de barra de pestañas.

¿Cómo presento mi vista de confirmación de manera modal para que ocupe toda la pantalla (como la vista del selector de imágenes) cuando el usuario selecciona una foto? Idealmente, quiero algo como esto:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    [picker dismissModalViewControllerAnimated:YES]; 
    UIViewController *modal = [[UIViewController alloc] init]; 
    modal.view = confirmationView; 
    [self presentModalViewController:modal animated:YES]; 
    [modal release]; 
} 

Sin embargo, eso bloquea la aplicación. ¿Debería presentar la vista de confirmación de forma modal desde el PICKER? De ser así, ¿cómo me aseguro de que cuando se descarte la vista de confirmación, tampoco se muestre el selector?

EDIT:

Corregido el error en el código que he publicado. Eso es lo que sucede cuando trato de escribir desde la memoria en lugar de copiar + pegar :(De todos modos, las sugerencias hasta ahora no ayudan.

Si presento el controlador modal ENTONCES descartar el selector, no pasa nada, presumiblemente ya que ambos controladores . posteriormente, se desestiman

Si me olvido el selector presente, entonces el controlador modal, consigo una excepción sobre las transiciones modales:.

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from <UINavigationController: 0x6b33940> to <UIViewController: 0x6b62b00> while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed' 

Respuesta

0

Estás liberando modal antes de presentarlo Prueba esto:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIViewController *modal = [[UIViewController alloc] init]; 
    modal.view = confirmationView; 
    [self presentModalViewController:modal animated:YES]; 
    [modal release]; 
    [picker dismissModalViewControllerAnimated:YES]; 
} 
+0

Creo que también necesita cerrar el selector antes de presentar la nueva vista modal. –

+0

Ninguna de estas sugerencias ayuda. El lanzamiento fue solo un error en el código que escribí, pero no estaba en el código original. Descartar al selector antes de presentar la vista modal da como resultado una excepción. Ver mis ediciones – pmc255

0

Ah. Parece que no puede presentar y descartar un controlador de vista modal en el mismo método.

Puede usar una propiedad (para ayudar con la administración de la memoria) para almacenar el diccionario de información, y un ivar para almacenar algo así como "didSelectImage". Luego en viewDidAppear: de su controlador de vista, si didSelectImage == YES, presente su controlador de vista de manera modal usando los detalles en el diccionario de información.

Asegúrese de restablecer didSelectImage en NO y establezca la propiedad del diccionario de información en cero una vez que ya no se necesiten.

3

Encontré la solución. De hecho, el selector debe ser descartado, y el truco consiste en desactivar las animaciones para ese despido, de modo que suceda de inmediato, y luego presente la segunda vista modal.

EDITAR: En realidad, me da CASI mucho de lo que quiero. Cuando cierra el selector, la vista original se muestra por una fracción de segundo, y luego la vista modal se anima. Esto se ve un poco raro.

También intenté mantener el selector y no descartarlo. En cambio, llamo al [picker presentModalViewController:modal animated:YES]. Esto me permite una transición suave desde el selector a la vista de confirmación. Sin embargo, cuando termine con la vista de confirmación, necesito llamar al [self dismissModalViewControllerAnimated:YES] desde el controlador original. Esto tiene el efecto de mostrar primero el selector de imágenes antes de descartar todo. De nuevo, no es exactamente lo que quiero.

Idealmente, quiero el mismo efecto que utiliza la aplicación Facebook iPhone para subir fotos. Una vez que haya seleccionado una foto, la transicionará sin problemas a una vista de confirmación.Al cancelar o confirmar desde esa vista, se realizará una transición sin problemas a la vista principal original. Hace que parezca que la vista de confirmación forma parte del selector de imágenes, cuando probablemente se trate de otra vista personalizada.

¿Cómo puedo hacer esto?

1

Prueba esto ...

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIViewController *modal = [[UIViewController alloc] init]; 
    modal.view = confirmationView; 
    picker.navigationController pushViewController:modal animated:YES]; 
    [modal release]; 
} 
0

Esto funcionó para mí:

[myViewControllerA presentModalViewController:myViewControllerB]; 
//... let myViewControllerB do its job 
[myViewControllerB presentModalViewController:myViewControllerC]; 
//... let myViewControllerC do its job 
[myViewControllerA dismissModalViewControllerAnimated:YES]; 

Es decir, que presentan los controladores de Vista como este A => B(modal) => C(modal), y luego llamar a apartar de Vista Controlador A en para perder tanto B como C a la vez.

Cuestiones relacionadas