2012-04-10 2 views
4

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.

Antwort

2

Zahlen Ich würde diese Stunden lösen, nachdem ich ein Kopfgeld darauf postete!

Das Problem war, dass die fetchEntries-Methode, die ich nicht posten, weil ich nicht dachte, dass es der Übeltäter war, setzt den ausgewählten Index des segmentierten Steuerelements auf -1, wenn es seinen Aufruf an den Server abschließt. Scheint, dass neuere Versionen von iOS das EventValueChanged ignorieren, wenn es in -1 geändert wird. Ich habe einfach eine Bedingung gesetzt, um einen -1 Index auf dem segmentierten Steuerelement in segmentAction: method zu ignorieren und es funktioniert.

-(void) segmentAction:(id)sender{ 

    if(segmentedControl.selectedIndex != -1){ 
     //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]; 
    } 

} 
+0

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

1

Sie rufen nicht super von innerhalb -(void)viewWillAppear:(BOOL)animated.

Versuchen Sie, die folgende Zeile an der Spitze hinzu:

[super viewWillAppear:animated]; 

Dies könnte bedeuten, dass die Super-Umsetzung Ihrer Viewcontroller nicht seine korrekt angezeigt Flags nicht gesetzt.

+0

Während dies in der Tat etwas ist, das ich vermisste, hat es den Absturz nicht behoben. – Squatch

+0

Ist die Fehlermeldung immer noch gleich? Versuchen Sie vielleicht, einen Viewcontroller zu schließen/zu präsentieren, während einer präsentiert wird? Hast du versucht, alle Animationen auszuschalten? – FelixLam

+0

Absturzmeldung ist die gleiche. - Es gibt keine andere Sichtweise, die sich störend auswirken würde. Die Daten der Tabellenansicht, die nach dem Sortieren neu geladen werden, können der Übeltäter sein, aber ich weiß immer noch nicht, wann/wo sortiert werden soll, das würde keine Animationen stören.- Wenn der Modalansicht-Controller ohne Animation dargestellt wird, wird keine modale Ansicht angezeigt. Wenn Sie die Animation für die Deaktivierung deaktivieren, muss ich eine Auswahl in der modalen Ansicht genau dreimal hintereinander treffen, um die Ansicht zu schließen, und die übergeordnete Ansicht ist nicht mehr zentriert, wenn sie wieder auf dem Bildschirm angezeigt wird. Sehr seltsames Verhalten. – Squatch

Verwandte Themen