it-swarm.com.de

iPhone stürzt ab, wenn der Controller für modale Ansicht präsentiert wird

Ich versuche, eine modale Ansicht direkt anzuzeigen, nachdem eine andere Ansicht modal dargestellt wurde (die zweite ist eine Ladeansicht, die angezeigt wird).

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

Wenn ich das tue, bekomme ich jedoch ein "Programm empfangenes Signal:" EXC_BAD_ACCESS "." Error.

Die Stapelverfolgung 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 verblüfft! Die Ladeansicht ist leer, so dass definitiv nichts passiert, was den Fehler verursacht. Hat es etwas damit zu tun, 2 Ansichten modal in derselben Ereignisschleife zu starten oder so?

Vielen Dank,

Mike

Edit: Sehr seltsam ... Ich habe es ein wenig geändert, so dass die Ladeansicht nach einer kurzen Verzögerung angezeigt wird, und das funktioniert gut! Es scheint also etwas innerhalb 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];  
}
30

Ich habe es etwas geändert, so dass die Ladeansicht nach einer kleinen Verzögerung angezeigt wird, und dies funktioniert gut! Es scheint also etwas innerhalb 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];  
}
30

Ich glaube, ich habe den gleichen Fehler in iOS 4 reproduziert. In meiner Anwendung trat der Absturz beim Versuch auf, eine zweite modale Ansicht unmittelbar nach dem Anzeigen einer ersten modalen Ansicht anzuzeigen. Ich musste einige Stunden lang wahnsinnig werden.

Nachdem ich die Beiträge in diesem Thread gelesen hatte, versuchte ich, ein einfaches reproduzierbares Beispiel mit der Vorlage "Anwendungsleiste" zu erstellen. Ich konnte den UIImagePickerController verwenden, um die erste modale Ansicht anzuzeigen, nachdem auf einen Knopfklick in "FirstViewController.m" geantwortet wurde. Als ich versuchte, den UIImagePickerController erneut anzuzeigen (nachdem die imagePickerControllerDidCancel-Nachricht verarbeitet wurde), stürzte die Anwendung mit demselben Fehler ab.

Auf dem Gerät gab es einfach keine Ahnung, was los war. Als ich den Code auf dem Simulator ausgeführt habe, hatte ich das Glück, diese Meldung 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'

Daher scheint es meine einzige Wahl zu sein, den Ratschlägen der Fehlermeldung zu folgen und einfach zu warten, bis viewDidAppear (mit einem Flag zeigt an, dass ich mich in diesem speziellen Modus befinde) und dann die zweite modale Ansicht zu laden.

Hier ist die vollständige Stapelverfolgung für Vollständigkeit:

 ** Aufrufstack beim ersten Wurf: 
 (
 0 CoreFoundation 0x0238c919 __exceptionPreprocess + 185 
 1 libobjc.A.dylib 0x024da5de objc_exception_throw + 47 
 2 CoreFoundation 0x02345078 + [NSException Raise: Format: Argumente:] + 136 
 3 Foundation 0x000ab8cf - [NSAssertionHandler handleFailureInMethod: Objekt: Datei: Zeilennummer: Beschreibung:] + 116 
 4 UIKit 0x00544317 - [UIWindowController Übergang: fromViewController: toViewController: Ziel: didEndSelector:] + 212 
 5 UIKit 0x0035c769 - [UIViewController presentModalViewController: withTransition:] + 2937 
 6 TestTempDelete 0x000021cf - [FirstViewController showImagePicker] +. ] 7 Foundation 0x0002fcea __NSFireDelayedPerform + 441 
 8 CoreFoundation 0x0236 dd43 __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 Start + 53 

Hoffe das hilft.

5
Daniel

** Wie bereits gesagt, verwenden Sie 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];
    }
4
user353877

Wenn Sie dies erhalten, nachdem Sie auf eine Schaltfläche geklickt haben, die mit Ihrem Code in Interface Builder verknüpft war, haben Sie zwei Aktionen, die mit einer Schaltfläche verknüpft sind (wenn Sie beispielsweise eine modale Ansicht mit einer Schaltfläche verknüpft haben und dann die Schaltfläche duplizieren und verknüpfte eine andere modale Ansicht). Dies wird versuchen, beide abzufeuern, und daher schlägt diese Nachricht fehl.

3
Simon

Ich bin auf dieselbe Ausnahme gestoßen 

App wird wegen nicht abgerufener Ausnahme 'NSInternalInconsistencyException' beendet, Grund: 'Versuch, einen modalen Übergang von bis zu beginnen, während ein Übergang bereits ausgeführt wird. Warten Sie, bis viewDidAppear/viewDidDisappear informiert ist, dass der aktuelle Übergang abgeschlossen ist. '

Wie bereits angedeutet, habe ich versucht, einen modalen Übergang zu verzögern, aber das hat nicht wirklich geholfen. Ich habe dann festgestellt, dass ich mehrere IBActions mit dem TouchUpInside-Ereignis meiner Schaltfläche verbunden hatte !!! . In meinem Fall würden zwei IBActions beginnen: einen People Picker modal und einen Image Picker modal präsentieren. Dies erklärt die Fehlermeldung. Prüfen Sie, ob Sie mehrere IBActions angeschlossen haben!

3
Eddy

Ich hatte einen ähnlichen Fehler, als ich auf UIButton klicke, um einen Modal View zu öffnen. Ich änderte den UIButton's Listener von UIControlEventAllEvents in UIControlEventTouchUpInside. Grundsätzlich wurde die Modalansicht auf Touch Down Inside und dann erneut auf Touch Up Inside ausgelöst.

1
Chris

Ich hatte das gleiche Problem wegen Unstimmigkeiten zwischen den Namen in

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

und den Namen der aktuellen .xib-Datei.

1
Alexey Podlasov

Ihr Problem liegt höchstwahrscheinlich in der Methode, die die Methode enthält, in der sich viewDidAppear befindet, oder in der Methode init/viewDidLoad/viewWillAppear von LoadViewController.

Setze einige Haltepunkte und folge bis zum Absturz ...

1
Jordan

Ich denke, dieses Problem hat etwas mit einem Problem zu tun, das mir auch begegnet ist. Es ist sehr einfach zu reproduzieren:

Erstellen Sie ein neues XCode-Projekt "Utility Application". In FlipsideViewController.m Fügen Sie einfach die folgende Methode ein:

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

Wenn Sie dies tun, starten Sie die Anwendung, und die Kehrseite wird direkt Aktiviert. Sobald Sie die Schaltfläche "Done" auf der Flipside-Ansicht drücken, gelangen Sie zurück Zur Hauptansicht, die viewDidAppear erneut auslöst und direkt zur Flipside-Ansicht (.____.) Zurückkehrt. Sobald die Flipside-Ansicht angezeigt wird, stoppt die Anwendung - es werden keine Speicher Deallocators aufgerufen - es ist genau so, als hätten Sie die Home-Taste gedrückt.

Als ich einige zusätzliche Eigenschaften in diesen Ansichten verwendete, bekam ich auch die Ausnahme, , Also habe ich den Code auf ein Minimum reduziert ...

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

Viele Grüße, Tobias

1
Tobias

Ich bin gerade auf dieses Problem gestoßen und habe es mit dem Selektor korrigiert: afterDelay-Vorschlag oben. Nur um es hinzuzufügen, ich kompilierte (ohne das Update) unter iPhone OS 4.0 Beta und NO CRASH! Der Fehler in XCode scheint also in der nächsten Generation behoben worden zu sein. Nicht, dass dies irgendjemandem von uns heute etwas nützt, aber, damit Sie alle wissen, ist es wirklich war ein Fehler in Xcode und nicht unbedingt etwas, was wir in unseren Codierungsstilen falsch gemacht haben.

0
pulseft

Ich hatte gerade dieses Problem, und es stellte sich heraus, dass mein Problem darin lag, dass ich mein Protokolldelegierter Dealloc war.

0
NixonsBack

Ich hatte ein ähnliches Problem, als ich dieselbe Technik verwendete, um eine Ladesicht zu implementieren. Es stürzte ab, wenn die Ladeansicht am Ende der Ladung verworfen wurde. In meinem Fall bestand das Problem darin, dass sobald die Ladeansicht verworfen wurde, viewDidAppear erneut aufgerufen wurde und versucht wurde, die Beladung zu präsentieren view, was vermutlich den Absturz ausgelöst hat. Ich habe es einfach behoben, indem ich vorher nachgesehen habe, ob die Ladeansicht dargestellt wurde:

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

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

Dann setze ich needDisplayLoader auf NO, bevor ich die Loader-Ansicht verwende

Hoffe das hilft...

0
Rom

Ich denke, der Grund für die Schleife ist, dass der neue View-Controller, den Sie laden, standardmäßig eine viewDidAppear-Methode hat 

[super viewDidAppear animated];

das bedeutet, dass es wieder viewDidAppear Ihres Main View Controllers aufrufen wird, so dass es in einer Schleife abläuft

in Viewcontroller haben Sie eine Methode wie diese ohne Super-Viewdidapper:

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

}
0
NSGodMode

Es hängt wirklich davon ab, was die Supportroutinen für viewDidAppear tun. Wenn zum Beispiel presentModalViewController:animated:loader nicht beibehalten wird, kann der Absturz darauf zurückzuführen sein, dass UIWindowController versucht, über loader zu sprechen, das inzwischen freigegeben wurde (am Ende der von Ihnen geposteten Routine).

0
fbrereto

Hatte genau das gleiche Problem. Gelöst es mit den oben vorgeschlagenen ...

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

Musste eine Verzögerung von 0,5 Sekunden verwenden. Möglicherweise, weil ich presentModalViewController direkt nach einem UIPickerViewController-Modal durchführte.

0
Nate Potter