Подтвердить что ты не робот

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

Я работаю над 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 > пока выполняется презентация или увольнение!

Любые подсказки об этом?

Спасибо

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Hey presto, больше ошибок!

Ответ 4

Ориентация на iOS6, это то, что сработало для меня:

if (![self.presentedViewController isBeingDismissed]) 
    [self.presentedViewController dismissViewControllerAnimated:YES
                                                     completion:nil];

Ответ 5

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

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