Странное предупреждение об отклонении контроллера модального представления

Я работаю над iOS 6. В моем приложении есть стандартный контроллер навигации со встроенным CustomViewController. В этом контроллере я создаю такое модальное представление:

-(IBAction)presentModalList:(id)sender {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    StationsListViewController *list = [storyboard instantiateViewControllerWithIdentifier:@"StationsListViewController"];
    [list setStationsData: [self.stationsData allValues]];
    [self presentModalViewController:list animated:YES];
}

Модальный контроллер показывает отлично, но отклонение генерирует предупреждение. Метод увольнения в этом контроллере:

-(IBAction)backToMap
{
    [self dismissModalViewControllerAnimated:YES];
}

Сгенерированное предупреждение: Предупреждение:

Попытка закрыть из контроллера представления ‹UINavigationController: 0x1ed91620> во время презентации или закрытия!

Есть какие-нибудь подсказки по этому поводу?

Спасибо


person Sparviero    schedule 04.09.2012    source источник
comment
Связанный - stackoverflow.com/questions / 1412021 /   -  person ChrisF    schedule 03.04.2013


Ответы (5)


Ориентируясь на iOS6, у меня сработало следующее:

if (![self.presentedViewController isBeingDismissed]) 
    [self.presentedViewController dismissViewControllerAnimated:YES
                                                     completion:nil];
person Yoni Hassin    schedule 24.08.2013

Я понимаю, что это запоздалый ответ, но, возможно, это поможет кому-то другому, ищущему решение этой проблемы, вот что я сделал:

-(IBAction)backToMap
{
    if (![[self modalViewController] isBeingDismissed])
        [self dismissModalViewControllerAnimated:YES];
}

Что касается меня, я обнаружил, что эта строка кода вызывается несколько раз, я не мог понять, почему, так что это было самое простое решение.

person JDx    schedule 25.10.2012
comment
Я тоже столкнулся с этой проблемой. Может случиться так, что ваш dimissModalViewControllerAnimated: вызов может быть помещен в метод обратного вызова (IBAction), который (прямо или косвенно) запускается нажатием кнопки «Отмена» в модальном представлении, который уже обрабатывает отклонение модального представления. Так что этот dismissModalViewControllerAnimated: может быть дубликатом и может быть удален. - person smileyborg; 14.01.2013
comment
У меня была аналогичная проблема, но она была вызвана представлением viewController, которое затем почти сразу же было отклонено (так что отклонение было во время анимации настоящего). Поэтому мне пришлось проверить isBeingPresented. - person Olie; 06.02.2013
comment
Это странно. Я думаю, что @smileyborg что-то замечает. Но я не понимаю, почему он автоматически закрывается? Все, что я сделал, это раскрутка, и мне не нужно отказываться от нее напрямую? - person huggie; 04.03.2013

Спасибо, JDx, за то, что направил меня на правильный путь. Я адаптировал его для формирования этого решения, которое удалит предупреждение без использования функций, которые устарели в iOS 6:

-(IBAction)backToMap
{
    if (![self.presentedViewController isBeingDismissed]) {
        [self dismissViewControllerAnimated:YES completion:^{}];
    }
}
person Kyle Clegg    schedule 17.01.2013

Я нашел этот подход ненадежным - скажем, в одном случае из пяти я все равно вижу ошибку.

Мое решение состояло в том, чтобы использовать блок завершения для установки флага, который контролирует, безопасно ли отклонить - таким образом вам не нужно проверять, отклоняется ли представление.

-(IBAction)presentModalView:(id)sender {
    :
    self.canDismiss = NO;
    [self presentViewController:aVC animated:YES completion:^{ 
      self.canDismiss = YES; 
     }];
    :
}

В той части кода, где происходит отклонение, просто проверьте флаг:

-(void)dismisser {
    :
    if (self.canDismiss) {
      [self dismissViewControllerAnimated:YES completion:nil];
    }
    :
}

Привет, ошибок больше!

person JAWZ apps    schedule 14.05.2013

Вы можете делать все, что хотите, после завершения метода увольнения, как:

-(IBAction)backToMap
{
    [self dismissViewControllerAnimated:YES
                             completion:^{
                                 //Do something here
                             }];
}
person gdm    schedule 24.10.2013