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

"Вызов одного экземпляра диспетчера представлений более одного раза не поддерживается" исключение

Я использую следующий код для извлечения некоторых сообщений и помещения их в папку "Входящие".

MyInboxVC *inboxVC=[MyInboxVC get ];
//upload all the pending messages
UINavigationController *devNavController=[[MyappMgr get]getDeveloperNavigationController ];

[devNavController pushViewController:inboxVC animated:YES];
[devNavController setNavigationBarHidden:NO];

Я получаю исключение

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Pushing the same view controller instance more than once is not supported (<MyInboxVC: 0x1452a0>)'

Что это значит? Что я делаю неправильно?

4b9b3361

Ответ 1

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

if(![self.navigationController.topViewController isKindOfClass:[YOURCLASS class]]) {

изменить//

это происходит чаще на старых устройствах с медленной анимацией, например, iphone 3 или 3gs

Ответ 2

Сначала обработайте сбой, чтобы он не убил ваше приложение:

@try {
    [self.navController pushViewController:viewController animated:NO];
} @catch (NSException * e) {
    NSLog(@"Exception: %@", e);
} @finally {
    //NSLog(@"finally");
}

Затем, если вы получите ошибку, используйте popTo

- (void)pushViewController:(UIViewController *)viewController {
  if (viewController) {
    @try {
        [self.navController pushViewController:viewController animated:NO];
    } @catch (NSException * ex) {
        //"Pushing the same view controller instance more than once is not supported" 
        //NSInvalidArgumentException
        NSLog(@"Exception: [%@]:%@",[ex  class], ex );
        NSLog(@"ex.name:'%@'", ex.name);
        NSLog(@"ex.reason:'%@'", ex.reason);
        //Full error includes class pointer address so only care if it starts with this error
        NSRange range = [ex.reason rangeOfString:@"Pushing the same view controller instance more than once is not supported"];

        if ([ex.name isEqualToString:@"NSInvalidArgumentException"] &&
           range.location != NSNotFound) {
            //view controller already exists in the stack - just pop back to it
            [self.navController popToViewController:viewController animated:NO];
        } else {
            NSLog(@"ERROR:UNHANDLED EXCEPTION TYPE:%@", ex);
        }
    } @finally {
        //NSLog(@"finally");
    }
  } else {
    NSLog(@"ERROR:pushViewController: viewController is nil");
  }
}

Ответ 3

Это означает, что ViewController, возвращаемый из [MyInboxVC get], уже находится в стеке навигации devNavController. Вы не можете добавить один и тот же объект в стек несколько раз.

По-видимому, у вас уже есть MyInboxVC. Убедитесь, что вы вытащили его, когда он больше не нужен.

Что означает "что это значит", но у вас недостаточно информации, чтобы знать, что вам нужно сделать, чтобы исправить это.

Я предполагаю, что ваш стек навигации растет больше, чем вы ожидаете, а это значит, что вы не выходите так часто, как должны.

Ответ 4

Вы выполняете это как часть segue? Если да, то вам не нужно нажимать VC на ваш навигационный контроллер, потому что segue сделает это уже. Вот почему возникает ваша ошибка - вы нажимаете VC, который уже находится в стеке NavController.

Ответ 5

Это означает, что вы нажимаете один и тот же объект viewcontroller на стек, когда он уже там.

[self.navigationController pushViewController:viewControllerObj animated:NO];

[self.navigationController pushViewController:viewControllerObj animated:NO];

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

Ответ 6

Это ожидаемое поведение UINavigationController, где возникает исключение при попытке нажать контроллер представления, который уже присутствует в стеке (его там из iOS 2.2).

Ответ 7

Основной причиной этой проблемы, очевидно, если код, который нажал на контроллер вида, вызывается более одного раза. Это может произойти по многим причинам, наиболее распространенная ошибка, когда метод обратного вызова запускается из фонового потока, где этот метод может выполняться более одного раза, пока он все еще нажимает на контроллер вида. Пример: Вызов службы api в фоновом потоке при нажатии кнопки, что позволит вам нажимать кнопку более одного раза, и поэтому обратный вызов, который выталкивает контроллер вида, вызывается более одного раза. Решение @Melvin и @Sam действительны, если вы не хотите исправлять исходную проблему, не нажимая более одного раза.

Ответ 8

Другой вариант, который я испытал, заключается в том, что [MyInboxVC get] не возвращает экземпляр объекта MyInboxVC вообще. Знак подсказки этого будет состоять в том, что ошибка говорит: "Нажатие одного и того же экземпляра контроллера экземпляра более одного раза не поддерживается (notTheInboxVC: 0x9e31660)". класс, который выдвигается более одного раза, не является ожидаемым MyInboxVC (падение из MyInboxVC не выделяется)

Ответ 9

Это происходило со мной, когда нажатие кнопки на панели было слишком быстрым, и было трудно воспроизвести, если только вы не обманули кнопку на кнопках. Следующее зафиксировало это, отключив кнопку, запустив навигационное нажатие, а затем включив кнопку в основном потоке (потому что она будет вызвана после анимации от нажатия).

- (void)showMore
{
    self.navigationItem.leftBarButtonItem.enabled = NO;
    [self.navigationController pushViewController:moreVC animated:YES];
    [self.navigationItem.leftBarButtonItem performSelectorOnMainThread:@selector(setEnabled:) withObject:@(YES) waitUntilDone:NO];
}

Ответ 10

Убедитесь, что вы дважды не добавляете контроллер просмотра в стек навигации. Например -

navController = [[UINavigationController alloc] initWithRootViewController: self.mainViewC];
self.window.rootViewController = navController; [self.window makeKeyAndVisible];
[navController pushViewController: self.mainViewC animated: NO];

В этом случае mainViewC уже добавлен в стек при записи initWithRootViewController. Больше нет необходимости в pushViewController.

Ответ 11

[devNavController pushViewController: inboxVC animated: NO]; Установить анимированный как NO