it-roy-ru.com

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

Я работаю на 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];
}

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

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

Выдается предупреждение «Предупреждение: 

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

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

Спасибо

19
Sparviero

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

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

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

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

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

28
JDx

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

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

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

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

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

Эй, Presto, больше нет ошибок!

0
JAWZ apps

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

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