Неуравновешенные вызовы для перехода на начало/конец для <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];
Ответы
Ответ 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:
вызывается после того, как появился контроллер корневого представления, сообщение "Небалансные вызовы для начала и конца появления переходов" исчезло.