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

Неуравновешенные вызовы для перехода на начало/конец для <UINavigationController: 0xa98e050>

При компиляции кода я получил

"Несбалансированные вызовы для перехода на начало/конец для <UINavigationController: 0xa98e050>"

предупреждение.

Вот мой код

KVPasscodeViewController *passcodeController = [[KVPasscodeViewController alloc] init];
passcodeController.delegate = self;

UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeController];
[(UIViewController *)self.delegate presentModalViewController:passcodeNavigationController animated:YES];
4b9b3361

Ответ 1

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

Во-первых, в вопросе не указано, где был вызван новый viewController.
Я подозреваю, что это вызвано от -(void)viewDidLoad

Переместите соответствующий код на -(void)viewDidAppear:, и проблема должна исчезнуть.

Это связано с тем, что в -viewDidLoad представление загрузилось, но еще не было представлено, а анимации и представления еще не завершены.

Если вы намерены нажать окно, сделайте это после того, как окно будет представлено и нарисовано.

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

Ответ 2

Я обнаружил, что эта проблема возникает, если вы пытаетесь нажать новый контроллер представления во время предыдущей транзакции (анимации).

В любом случае, я думаю, это проблема presentModalViewController, Set animated:NO, может решить вашу проблему

[(UIViewController *)self.delegate presentModalViewController:passcodeNavigationController animated:NO];

Другой вариант:

Возьмите NSTimer и вызовите код выше между 0.50 до 1 второй. Это также полезный трюк. поэтому ваш проницательный viewController сделал свою анимацию.

Ответ 3

Это предупреждение появляется при попытке загрузить новый viewController до того, как ранее включенный его будет выполнен с анимацией. Если вы хотите сделать это, просто добавьте свой код в блок dispatch_async(dispatch_get_main_queue():

dispatch_async(dispatch_get_main_queue(), ^(void){
        [(UIViewController *)self.delegate presentModalViewController:passcodeNavigationController animated:YES];
});

и предупреждение исчезнет.

Ответ 4

современным решением может быть следующее:

double delayInSeconds = 0.5;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds *   NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [self.window.rootViewController presentViewController:yourVC animated:YES completion:nil];
});

Ответ 5

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

Чтобы избавиться от этого предупреждения, я зарегистрирую делегат приложения как делегата контроллера корневого представления навигации:

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ((UINavigationController *)self.window.rootViewController).delegate = self;
    return YES;
}

Затем я представляю контроллер модального представления в navigationController:didShowViewController:animated: с помощью dispatch_once:

- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        KVPasscodeViewController *passcodeController = [[KVPasscodeViewController alloc] init];
        passcodeController.delegate = self;

        UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeController];
        [(UIViewController *)self.delegate presentViewController:passcodeNavigationController animated:YES completion:nil];
    });
}

Так как navigationController:didShowViewController:animated: вызывается после того, как появился контроллер корневого представления, сообщение "Небалансные вызовы для начала и конца появления переходов" исчезло.