2012-04-10 3 views
4

Позвольте мне указать некоторый контекст: я создаю приложение с вкладками, которое позволяет пользователю находить и просматривать некоторые видеоролики, размещенные на нашем сервере. Каждая вкладка имеет видео, сгруппированные по-разному с сегментированным элементом управления на панели навигации, который пользователь может использовать для сортировки списка еще точнее (по названию, дате и т. Д.). При нажатии «Сортировка» в сегментированном элементе управления контроллер модального представления представлен опциями, доступными на определенной вкладке. Выбирается опция, и выбор передается обратно в контроллер родительского представления, который вызывает сервер для отсортированного списка.Modal View reappearing + crashing: «Попытка перехода во время перехода продолжается»

Теперь вот в чем проблема: на iOS 4.2, который мы хотели бы поддержать, модальный вид либо сбрасывается после выбора сортировки, либо отклоняется, а затем снова появляется снова. Если он снова появляется, он делает это только один раз и НЕ зацикливается на неопределенное время. Я знаю, что это имеет какое-то отношение к переходу и жизненному циклу представления, но я не могу понять, что это правильно.

Код:

родительское представление

-(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]; 
} 

модальное вид

@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; 
    } 
} 

Краш Результаты:

*** 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' 

Извините за длину. Я хотел быть предельно ясным и тщательным. Заранее спасибо!

EDIT: Я должен упомянуть, что появление сбоя/повторения кажется зависящим от того, где вызывается sortByButtonIndex: и когда представление отклонено.

ответ

2

Цифры Я решил бы это через несколько часов после того, как я разместил на нем щедрость!

Проблема заключалась в том, что метод fetchEntries, который я не опубликовал, потому что я не думал, что это был преступник, устанавливает выделенный сегментный элемент управления в -1, когда он завершает свой вызов на сервер. Похоже, что новые версии iOS игнорируют EventValueChanged, если он меняется на -1. Я просто устанавливаю условие, чтобы игнорировать индекс -1 для сегментированного элемента управления в методе segmentAction: и он работает.

-(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

Спасибо, что опубликовали ваше решение. Предлагая щедрость часто психологический триггер, который заставляет вас думать сложнее и найти решение самостоятельно, поэтому не жалеете о «потерянной» репутации в любом случае :) – MrTJ

1

Вы не звоните super с точностью до -(void)viewWillAppear:(BOOL)animated.

Попробуйте добавить следующую строку в верхней части:

[super viewWillAppear:animated]; 

Это может означать, что супер реализация вашего ViewController не устанавливает свои флаги появляются правильно.

+0

Хотя это действительно то, что я пропустил, это не устранило крушение. – Squatch

+0

Является ли сообщение о сбое тем же самым? Может быть, вы пытаетесь уволить/представить viewcontroller во время представления? Вы пытались отключить все анимации? – FelixLam

+0

Сообщение о сбое - то же самое. - Никакой другой взгляд не контролируется, что будет мешать. Данные табличного представления, которые перезагружаются при сортировке, могут быть виновниками, но я все еще не знаю, когда/где сортировать, что не мешает каким-либо анимациям.- Представление контроллера модального представления без анимации приводит к тому, что модальный вид вообще не отображается. Отключение анимации для результатов увольнения во мне нужно, чтобы вырезать выделение по модальному виду ровно три раза подряд, чтобы отклонить представление, а родительский вид неактивен, когда он возвращается на экран. Очень странное поведение. – Squatch

Смежные вопросы