Die Ausnahme in der iPhone-app : Modal Umstellung ist bereits im Gange
Habe ich, was ich glaube, ist eine ziemlich einfache Anwendung im moment, basierend auf ein paar tutorials zusammen gebastelt. Ich bin mit XCode 3.2.3 in OSX 10.6.4. Es begann als ein standard-iPhone "Window-Based Application". Mit interface-builder-ich habe eine Tab Bar Controller mit dem O ' Reilly-video-tutorial hier:
http://broadcast.oreilly.com/2009/06/tab-bars-and-navigation-bars-t.html
Im ersten Tab habe ich ein standard-UIView mit zwei Tasten. Beide rufen die gleiche Funktion für die Anzeige einer 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];
}
Mir läuft der code, der in einem emulator, so dass immer nur klicken Sie auf die Schaltfläche mit der Bezeichnung Wählen Sie "Foto". Wenn der Dialog erscheint mit einem Foto gewählt, diese Funktion läuft:
-(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];
}
Dies ist, wo mein problem liegt. Ich habe versucht viele verschiedene hacks und Iterationen, aber der obige code ist die einfachste, um das problem. Wenn die imageViewController ist die Darstellung als modales Dialog die folgende Ausnahme ausgelöst:
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'
Wie kann ich die Heilung dieser? Ich habe versucht, Verzögerungen und anderen tricks, aber nicht wirklich verstehen, wie soll ich verwenden viewDidAppear oder viewDidDisappear, um mir zu helfen. Bemerkenswert ist auch, dass eine sehr einfache Anwendung mit einem Blick laden die picker dann die Anzeige einer anderen Ansicht mit dem Bild in nicht zu dem Fehler. Jede Hilfe dankbar angenommen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf die spezifischen beschriebenen Problem hier, fügen Sie die Methode viewDidAppear in Ihrer Klasse:
Entfernen Sie diese Zeilen von unten Ihren Anruf:
So, wenn Sie Ihre Klasse
self
angezeigt wird (angezeigt wird), wird aufgerufenviewDidAppear
... Da dies wahrscheinlich nicht wirklich, was Sie wollen, die ganze Zeit, fügen Sie einige Variablen setzen/löschen, die bestimmt, ob oder nicht, um sofort dieimageViewController
wennself
angezeigt wird. So etwas wie "Wenn aus image-picker, zeigen die imageViewController, sonst nichts".Sagte, dass, imho, schieben modal Ansichten ist, sollte in der Regel erfolgt in Antwort auf eine Benutzer-Aktion-und ich würde vielleicht ein Umdenken in der user-experience-hier - z.B. um eine Untersicht anstatt eine modale Ansicht, die Sie tun könnte, wo Ihr derzeit den code - aber wenn Sie nur spielen, um mit einigen tutorials, die sollte lösen die NSInternalInconsistencyException. 🙂 Cheers!
In iOS 5.0 und höher können Sie
Ich lief in dieses Problem schon ein paar mal. Ich habe vor kurzem angefangen mit diesem einfachen fix:
Wenn ich dabei bin, eine neue modal-view-controller sofort nach der Entlassung einen anderen modal-view-controller, ich einfach schließen, der erste mit dem argument, NICHT in
dismissModalViewControllerAnimated:
.Seit der zweiten Ansicht dargestellt wird mit einer animation, Sie bemerken kaum, dass der erste Weg geht schnell. Und man bekommt nie die übergänge Konflikt.
Ich hatte das gleiche problem, wenn ich wollte ein MFMailComposeViewController sofort nach dem schließen der UIImagePickerController. Heres was ich getan habe:
Entfernte ich die
[imagePicker release];
- Anweisung aus, wo ich war, präsentiert die Bild-picker und steckte es in didFinishPickingMedia Rückruf.Ich verwendet
[self performSelector:@selector(presentMailComposer:) withObject:image afterDelay:1.0f];
Hier ist mein code:
Die Anzeige-Bild-Picker
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
NSArray *media = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
Bildauswahl Delegate Callback - didFinishPickingMedia
NSString *mediaType = [info valueForKey:UIImagePickerControllerMediaType];
Anzeigen Von E-Mail-Composer-Ansicht
if ([MFMailComposeViewController canSendMail]) {