Frage

Ich versuche gerade eine modale Ansicht anzuzeigen, nachdem eine andere Ansicht modal präsentiert worden ist (der zweite ist eine Lade Ansicht, das angezeigt wird).

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    LoadViewController *loader = [[LoadViewController alloc] init];
    [self presentModalViewController: loader animated:NO];
    [loader release];
}

Aber wenn ich dies tun, bekomme ich ein „Programmsignal empfangen:‚‘.“ EXC_BAD_ACCESS Fehler.

Der Stack-Trace ist:

0  0x30b43234 in -[UIWindowController transitionViewDidComplete:fromView:toView:]
1  0x3095828e in -[UITransitionView notifyDidCompleteTransition:]
2  0x3091af0d in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
3  0x3091ad7c in -[UIViewAnimationState animationDidStop:finished:]
4  0x0051e331 in run_animation_callbacks
5  0x0051e109 in CA::timer_callback
6  0x302454a0 in CFRunLoopRunSpecific
7  0x30244628 in CFRunLoopRunInMode
8  0x32044c31 in GSEventRunModal
9  0x32044cf6 in GSEventRun
10 0x309021ee in UIApplicationMain
11 0x00002154 in main at main.m:14

Irgendwelche Ideen? Ich bin total ratlos! Die Lade Blick ist leer, so gibt es auf jeden Fall nichts da drin los, der den Fehler verursacht. Ist es etwas, mit Start 2 Ansichten modal in der gleichen Ereignisschleife oder etwas zu tun?

Danke,

Mike

Edit: Sehr seltsam ... Ich habe es leicht modifiziert, so dass die Lade Ansicht nach einer kleinen Verzögerung angezeigt, und das funktioniert gut! So scheint es, etwas in der gleichen Ereignisschleife zu sein!

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    [self performSelector:@selector(doit) withObject:nil afterDelay:0.1];
}

- (void)doit {
    [self presentModalViewController:loader animated:YES];  
}
War es hilfreich?

Lösung

Ich habe es leicht modifiziert, so dass die Lade Ansicht nach einer kleinen Verzögerung angezeigt, und das funktioniert gut! So scheint es, etwas in der gleichen Ereignisschleife zu sein!

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    [self performSelector:@selector(doit) withObject:nil afterDelay:0.1];
}

- (void)doit {
    [self presentModalViewController:loader animated:YES];  
}

Andere Tipps

Ich glaube, ich die gleichen Fehler in iOS 4. In meiner Anwendung reproduziert, der Absturz konsequent aufgetreten ist, wenn eine zweite modale Ansicht unmittelbar nach zeigt eine erste modale Ansicht zu zeigen versucht. Ich kämpfte für ein paar Stunden verrückt.

Nach den Beiträgen zu diesem Thema zu lesen, habe ich versucht, ein einfaches reproduzierbares Beispiel mit der Tab-Bar Anwendungsvorlage zu erstellen. Ich konnte die UIImagePickerController verwenden, um die erste modale Ansicht zu zeigen, nachdem in „FirstViewController.m“ auf eine Schaltfläche klicken reagiert. Als ich versuchte, wieder die UIImagePickerController zeigen (nach der imagePickerControllerDidCancel Nachrichtenverarbeitung), die Anwendung mit dem gleichen Fehler abgestürzt ist.

Auf dem Gerät gab es einfach keine Ahnung, was los war. Allerdings, wenn ich den Code auf dem Simulator lief, ich hatte das Glück, diese Nachricht auf der Konsole zu erhalten:

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

So scheint es, dass meine einzige Wahl ist der Beratung der Fehlermeldung zu folgen und einfach bis viewDidAppear warten (einen Flag verwendet, um anzuzeigen, die ich in diesem speziellen Modus bin) und dann die zweite modale Ansicht zu laden.

Hier ist der vollständige Stack-Trace auf Vollständigkeit:

** Call stack at first throw:
(
 0   CoreFoundation                      0x0238c919 __exceptionPreprocess + 185
 1   libobjc.A.dylib                     0x024da5de objc_exception_throw + 47
 2   CoreFoundation                      0x02345078 +[NSException raise:format:arguments:] + 136
 3   Foundation                          0x000ab8cf -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
 4   UIKit                               0x00544317 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 212
 5   UIKit                               0x0035c769 -[UIViewController presentModalViewController:withTransition:] + 2937
 6   TestTempDelete                      0x000021cf -[FirstViewController showImagePicker] + 167
 7   Foundation                          0x0002fcea __NSFireDelayedPerform + 441
 8   CoreFoundation                      0x0236dd43 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
 9   CoreFoundation                      0x0236f384 __CFRunLoopDoTimer + 1364
 10  CoreFoundation                      0x022cbd09 __CFRunLoopRun + 1817
 11  CoreFoundation                      0x022cb280 CFRunLoopRunSpecific + 208
 12  CoreFoundation                      0x022cb1a1 CFRunLoopRunInMode + 97
 13  GraphicsServices                    0x02bf12c8 GSEventRunModal + 217
 14  GraphicsServices                    0x02bf138d GSEventRun + 115
 15  UIKit                               0x002beb58 UIApplicationMain + 1160
 16  TestTempDelete                      0x00001eb4 main + 102
 17  TestTempDelete                      0x00001e45 start + 53

Hope, das hilft.

** wurde wie vorhin gesagt, die Verwendung isIgnoringInteractionEvents

//Check if the app is ignoring interatctions, if so, add a delay for 1 sec
if([[UIApplication sharedApplication] isIgnoringInteractionEvents]==TRUE) {
        [currentViewController performSelector:@selector(presentModalViewController:animated:) withObject:screen afterDelay:1];
    } else {
        [currentViewController presentModalViewController:screen animated:YES];
    }

Es ist möglich, wenn Sie dies immer nach dem Klicken auf eine Schaltfläche, die im Interface Builder, um Ihren Code verlinkt, dass Sie auf eine Schaltfläche zwei Aktionen verknüpft haben (vielleicht, wenn Sie eine modale Ansicht auf eine Schaltfläche verknüpft haben, dann die Taste dupliziert und verknüpfen eine andere modal-Ansicht). Dies wird versuchen, sie beide aus Feuer und deshalb wird es mit dieser Meldung fehlschlagen.

Ich traf die gleiche Ausnahme

  

Beenden app aufgrund nicht abgefangene Ausnahme ‚NSInternalInconsistencyException‘ Grund: ‚modal Übergang zu beginnen Versuch, von zu, während ein Übergang bereits im Gang ist. Warten Sie viewDidAppear / viewDidDisappear der aktuelle Übergang wissen abgeschlossen "

Wie vorgeschlagen früher habe ich versucht zu verzögern, um einen Verkehr Übergang zu präsentieren, aber das half nicht wirklich. Ich fand dann, dass ich mehr IBActions mit meiner Schaltfläche TouchUpInside Ereignis !!! . In meinem Fall zwei IBActions beginnen würde: modal einen Menschen Picker modal und präsentiert ein Bild-Picker präsentiert. Dies erklärt die Fehlermeldung. Überprüfen Sie, ob Sie mehrere IBActions verbunden!

Ihr Problem ist höchstwahrscheinlich in der Methode, die INiTS und stellt die Methode, die viewDidAppear in ist, oder in der init / viewDidLoad / viewWillAppear Methode von LoadViewController.

einige Bruchstellen einstellen und folgen bis Absturz ...

hatte ich einen ähnlichen Fehler, wenn ein UIButton Anklicken eines Modal View zu öffnen. Ich änderte den UIButton's Hörer von UIControlEventAllEvents zu UIControlEventTouchUpInside. Im Grunde genommen war es das Brennen des Modal Blick auf Touch Down Inside und dann wieder auf Touch Up Inside.

Ich hatte das gleiche Problem wegen Nichtübereinstimmung zwischen Namen in

HelpViewController *controller = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil];

und der Name der tatsächlichen .xib Datei.

Ich denke, das Problem etwas mit einem Problem zu tun, das ich auch aufgetreten. Es ist sehr einfach zu reproduzieren:

Erstellen Sie neue XCode Projekt "Utility Application". Im FlipsideViewController.m Sie nur die folgende Methode ein:

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear: animated];
  [self showInfo];
}

Wenn Sie dies tun, um die Anwendung starten, dann die Kehrseite-Ansicht wird dann aktiviert werden Weg. Sobald Sie die Schaltfläche „Fertig“ auf der B-Seite-Ansicht drücken, erhalten Sie zurück auf die Hauptansicht, die viewDidAppear wieder und geht nach rechts zurück zum flipside- feuert Aussicht. Sobald die Kehrseite-Ansicht angezeigt wird, stoppt die Anwendung - kein Gedächtnis deallocators genannt -. es ist genauso wie Sie die Home-Taste gedrückt haben,

Als ich einige zusätzliche Eigenschaften in diesen Ansichten mit, ich habe auch die Ausnahme, so zog ich den Code auf den Mindestbetrag nach unten ...

Ich habe keine Ahnung, wirklich, was das Problem wirklich ist ...

Mit freundlichen Grüßen, Tobias

Es hängt wirklich davon ab, was die Unterstützung Routinen für viewDidAppear tun. Zum Beispiel, wenn presentModalViewController:animated: loader nicht beibehält der Absturz kann darauf zurückzuführen sein, die UIWindowController über loader zu sprechen versuchen, die da (am Ende der Routine, die Sie geschrieben) freigegeben wurde.

Ich hatte ein ähnliches Problem, während mit der gleichen Technik wie Sie eine Lade Ansicht zu implementieren. Es würde abstürzen, wenn die Lade Blick auf das Ende der Last entlassen wurde. In meinem Fall kam das Problem aus der Tatsache, dass, sobald die Lade Ansicht entlassen wurde viewDidAppear erneut aufgerufen wurde und versuchte, den Laden Blick wieder zu präsentieren, die vermutlich den Absturz ausgelöst. Ich reparierte es einfach durch Prüfen, ob die Ladeansicht vor vorgestellt worden war:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if(needDisplayLoader)
        [self presentModalViewController: loader animated:NO];
}

Dann habe ich needDisplayLoader zu NO vor der Loader-Ansicht Entlassung

Hope, das hilft ...

Ich lief in dieser Frage gerade jetzt, und korrigiert sie den Selektor: afterDelay Vorschlag oben. Nur hinzufügen, ich zusammengestellt (ohne fix) unter iPhone OS 4.0 Beta und NO CRASH! So erscheint der Fehler in XCode in der nächsten Generation festgelegt worden war. Nicht, dass dies tut jeder von uns alle gut heute, aber nur, damit Sie alle wissen, ist es wirklich lag bei einen Fehler in Xcode und nicht unbedingt alles, was wir in unserer Codierung Stile Unrechttuns wurden.

genau das gleiche Problem hatte. Gelöst es mit der oben vorgeschlagenen ...

[self performSelector:@selector(doit) withObject:nil afterDelay:0.5];

Wir hatten eine 0,5 Sekunden Verzögerung zu verwenden. Vielleicht, weil ich PresentModalViewController direkt nach einem UIPickerViewController modal ausführt.

Ich hatte gerade dieses Problem und es stellte sich heraus, dass mein Problem war, weil ich mein dealloc Protokoll Delegierten war.

Ich denke, der Grund für die Schleife ist, dass neue View-Controller Sie laden eine viewDidAppear Methode hat in der Standardeinstellung und es hat

[super viewDidAppear animated];

was bedeutet, werde es zu Ihrer Hauptansicht Controller viewDidAppear zurückrufen wieder, wie, dass sie auf einer Schleife gehen

in Viewcontroller Sie präsentieren eine Methode, wie diese, ohne Super viewdidapper:

-(void)viewDidAppear:(BOOL)animated{
    //[super viewDidAppear:animated]; no super

}

EXC_BAD_ACCESS ist ein Speicherfehler. Du bist wahrscheinlich ein Objekt zu verwenden versuchen, die bereits freigegeben wurde / freigegeben. Diese Antwort gibt einige Tipps für das Debuggen dieser Probleme:

Debugging EXC_BAD_ACCESS

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top