Lassen Sie mich einen Kontext bereitstellen: Ich erstelle eine Anwendung mit Tabs, mit der ein Benutzer einige auf unserem Server gehostete Videos finden und anzeigen kann. Auf jeder Registerkarte sind die Videos in einer anderen Art und Weise gruppiert, mit einem segmentierten Steuerelement in der Navigationsleiste, mit dem ein Benutzer die Liste noch genauer sortieren kann (nach Titel, Datum usw.). Wenn Sie im segmentierten Steuerelement auf "Sortieren" klicken, wird ein Modalansicht-Controller mit den auf einer bestimmten Registerkarte verfügbaren Optionen angezeigt. Eine Option wird ausgewählt und die Auswahl wird an den übergeordneten Ansichtscontroller weitergeleitet, der den Server für eine sortierte Liste aufruft.Modal View wird wieder angezeigt + Absturz: "Es wird versucht, während eines Übergangs zu übergehen"
Nun ist hier das Problem: Auf iOS 4.2, das wir unterstützen möchten, stürzt die modale Ansicht entweder ab, nachdem eine Sortieroption ausgewählt wurde, oder sie wird wieder gelöscht und erscheint dann noch einmal. Wenn es wieder erscheint, tut es nur einmal und läuft NICHT unbegrenzt. Ich weiß, dass es etwas mit dem Übergang und dem Lebenszyklus der Ansicht zu tun hat, aber ich kann das nicht richtig verstehen.
Code:
Die übergeordnete Ansicht
-(void) segmentAction:(id)sender{
//create a sort view and pass it a value that indicates what the options should be
ModalSortViewController *sortView = [[ModalSortViewController alloc]
initWithNibName:nil bundle:nil sortByView:0];
[sortView setDelegate:self];
[sortView setModalTransitionStyle:UIModalTransitionStylePartialCurl];
[sortView setModalPresentationStyle:UIModalPresentationFormSheet];
[self presentModalViewController:sortView animated:YES];
}
-(void) refresh:(id)sender{
[self fetchEntries];
}
//Delegate protocol for all tabbed table views
//Receives buttonIndex from the modal sort view
-(void)sortByButtonIndex:(int)buttonIndex{
if(buttonIndex==1){
//If sorting by title
fetchURL = @"fakeURL.com/?method=iGetCategories&sortBy=category&sortByOrder=ASC";
[self fetchEntries];
}
else if (buttonIndex==2){
//If sorting by number of items
fetchURL = @"fakeURL.com/?method=iGetCategories&sortBy=count&sortByOrder=DESC";
[self fetchEntries];
}
else if(buttonIndex==0){
//Resets sort selection to nothing
segmentedControl.selectedSegmentIndex = -1;
}
[self dismissModalViewControllerAnimated:YES];
}
Die modale Ansicht
@synthesize delegate, option1, option2;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil sortByView:(int)_viewInt
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
sortChosen = 0;
viewInt = _viewInt;
}
return self;
}
//This method is called whenever a selection on the modal view has been made.
//The button tags have been set in IB and are sent to the parent table view controller
//where a switch statement is in place to sort its data by the selection.
-(IBAction)madeSelection:(id)sender{
sortChosen = [sender tag];
[self.delegate sortByButtonIndex:sortChosen];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];//Added after Felix pointed out that the super was not called
switch (viewInt) {
case CAT_FOLDERS:
[self.option1 setTitle:@"By Category Name" forState:UIControlStateNormal];
[self.option2 setTitle:@"By Number of Items" forState:UIControlStateNormal];
break;
case PRES_FOLDERS:
[self.option1 setTitle:@"By Presenter Name" forState:UIControlStateNormal];
[self.option2 setTitle:@"By Number of Items" forState:UIControlStateNormal];
break;
case MEDIA:
[self.option1 setTitle:@"By Media Title" forState:UIControlStateNormal];
[self.option2 setTitle:@"By Release Date" forState:UIControlStateNormal];
break;
default:
break;
}
}
Crash-Ergebnisse:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'Attempting to begin a modal transition from <UINavigationController:
0x139160> to <ModalSortViewController: 0x172810> while a transition is already in
progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed'
Sorry über die Länge. Ich wollte so klar und gründlich wie möglich sein. Vielen Dank im Voraus!
EDIT: Ich sollte erwähnen, dass der Absturz/Wiederholung erscheint abhängig davon, wo sortByButtonIndex: aufgerufen wird, und wenn die Ansicht ist abgewiesen.
Vielen Dank für Ihre Lösung. Das Anbieten eines Kopfgeldes hat oft einen psychologischen Auslöser, der dich dazu bringt, härter zu denken und die Lösung selbst zu finden, also sorge dich nicht um den "verlorenen" Ruf auf jeden Fall :) – MrTJ