Ho in pratica quello che ritengo sia un'applicazione abbastanza semplice basata su alcuni tutorial accartocciati insieme. Sto usando XCode 3.2.3 in OSX 10.6.4. È iniziato come un'applicazione standard basata su Windows per iPhone. Utilizzando interface builder ho aggiunto un Tab Bar controller utilizzando il video tutorial O'Reilly qui:Eccezione nell'app per iPhone: la transizione modale è già in corso
http://broadcast.oreilly.com/2009/06/tab-bars-and-navigation-bars-t.html
nella prima scheda ho un UIView di serie con due pulsanti. Entrambi chiamano la stessa funzione per visualizzare 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];
}
Sono in esecuzione il codice all'interno di un emulatore in modo sempre e solo fare clic sul pulsante chiamato Seleziona immagine. Quando il dialogo viene rilasciato con una foto scelta questa funzione viene eseguito:
-(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];
}
Questo è dove il mio problema. Ho provato diversi tipi di hack e iterazioni, ma il codice precedente è il più semplice per presentare il problema. Quando l'imageViewController viene visualizzato come un dialogo modale viene lanciata la seguente eccezione:
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'
Come faccio a curare questo? Ho provato ritardi e altri trucchi ma non capisco davvero come dovrei usare viewDidAppear o viewDidDisappear per aiutarmi. Si noti inoltre che un'applicazione molto semplice con una vista che carica il selettore e quindi visualizza un'altra vista con l'immagine in non produce l'errore. Qualsiasi aiuto ricevuto con gratitudine.
Grazie per i consigli, cercherò che nel mio codice come è più ordinato di quello che sto facendo. Sto premendo la vista modale dopo che l'utente ha scattato una foto o selezionato una foto. L'idea qui è che c'è un po 'di elaborazione delle immagini potenzialmente intensa e voglio mostrarlo modamente all'utente fino al suo completamento. Quindi c'è un'azione dell'utente prima di forzare la vista modale. Come una parte ho infine ucciso l'eccezione con questo:
– DizietOK picker.view.superview removeFromSuperview. Davvero una pessima soluzione a meno che non ti piacciano gli schermi vuoti per tutto in seguito! Ho ricostruito l'app da zero alla fine utilizzando un controller della barra di navigazione all'interno di un'app tab tab e questo ha funzionato correttamente. In un'altra nota, anche la tua soluzione ha funzionato. Grazie. Molto più chiaro ora. L'ho fatto solo per 2 giorni da uno sfondo C/C++/Java/Perl/bash. – Diziet