tengo lo que creo es una aplicación bastante sencilla en el momento en base a algunos tutoriales improvisado. Estoy usando XCode 3.2.3 en OSX 10.6.4. Comenzó como un iPhone estándar "Aplicación basada en la ventana". El uso de constructor de interfaces he añadido un controlador de barra de pestañas usando el video tutorial O'Reilly aquí:Excepción en aplicación de iPhone: Modal de transición ya está en marcha
http://broadcast.oreilly.com/2009/06/tab-bars-and-navigation-bars-t.html
En la primera pestaña Tengo un UIView estándar con dos botones. Ambos llaman la misma función para mostrar un UIImagePickerController:
-(IBAction) btnPhotoClicked:(id)sender {
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
if((UIButton *)sender == btnChoosePhoto)
{
imagePicker.allowsEditing = YES;
imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
} else {
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}
[self presentModalViewController:imagePicker animated:YES];
[imagePicker release];
}
Me postulo el código dentro de un emulador de manera única cada vez haga clic en el botón de llamada Elija las fotos. Cuando el diálogo se libera con una foto elegido esta función se ejecuta:
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSURL *mediaUrl;
mediaUrl = (NSURL *)[info valueForKey:UIImagePickerControllerMediaURL];
if (mediaUrl == nil)
{
imagePuzzle = (UIImage *) [info valueForKey:UIImagePickerControllerEditedImage];
if(imagePuzzle == nil)
{
//--- Original Image was selected ---
imagePuzzle = (UIImage *) [info valueForKey:UIImagePickerControllerOriginalImage];
}
else {
//--- Get the edited image ---
//--- If it was successful the above valueForKey:UIImagePickerControllerEditedImage
//--- would have assigned it already.
}
}
else {
//--- Muppet selected a video
}
// Animate the picker window going away
[picker dismissModalViewControllerAnimated:YES];
ImageViewController *imageViewController = [[ImageViewController alloc] init];
imageViewController.delegate = self;
[self presentModalViewController:imageViewController animated:YES];
[imageViewController release];
}
Aquí es donde radica mi problema. He intentado muchos hacks e iteraciones diferentes, pero el código anterior es el más simple para presentar el problema. Cuando el imageViewController se muestra como un diálogo modal, se lanza la siguiente excepción:
2010-07-09 15:29:29.667 Golovomka[15183:207] *** Terminating app due to uncaught
exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal
transition from <NewViewController: 0x5915f80> to <ImageViewController: 0x594a350>
while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear
to know the current transition has completed'
¿Cómo puedo solucionar esto? He intentado con retrasos y otros trucos, pero realmente no entiendo cómo se supone que debo usar viewDidAppear o viewDidDisappear para ayudarme. También es de notar que una aplicación muy básica con una vista cargando el selector y luego mostrando otra vista con la imagen no produce el error. Cualquier ayuda recibida con gratitud
Gracias por el consejo, voy a tratar de que en mi código, ya que es más limpio que lo que estoy haciendo. Estoy presionando la vista modal después de que el usuario tomó una foto o seleccionó una foto. La idea aquí es que hay un procesamiento de imagen potencialmente intenso y quiero mostrarlo modalmente al usuario hasta que se complete. Entonces, hay una acción del usuario involucrada antes de forzar la vista modal. Como un lado finalmente maté la excepción con esto:
– DizietAceptar picker.view.superview removeFromSuperview. ¡Una solución realmente mala a menos que te gusten las pantallas en blanco para todo después! Reconstruí la aplicación desde cero al final usando un controlador de barra de navegación dentro de una aplicación de barra de pestañas y funcionó bien. En otra nota, tu solución también funcionó. Gracias. Mucho más claro ahora. Solo he estado haciendo esto durante 2 días desde un fondo de C/C++/Java/Perl/bash. – Diziet