2014-01-13 2 views
1

В моем приложении у меня есть UIViewControllers A, B, C, D. Что я могу сделать это пройти от А до В до С до D. Теперь стек читается как A, B, C, DiOS - вложенная анимация push может привести к поврежденной панели навигации

я удалить C и D, которые 2 верхних элементов в стеке, используя

[self.navigationController popToViewController:BViewController animated:NO]; 

Когда я NSLog сейчас, у меня есть A, B в стеке. Теперь, когда я пытаюсь перейти на C, я получаю «Вложенная анимация push может привести к поврежденной панели навигации». Я озадачен, почему это происходит. Кто-нибудь может помочь мне в решении этой проблемы. Спасибо за ваше время

EDIT От BI перейти к C, используя код ниже

UIStoryboard *storybord = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
UIViewController *viewController = [storybord instantiateViewControllerWithIdentifier:@"C"]; 
[self.navigationController pushViewController:viewController animated:YES]; 

После выполнения этого кода, есть асинхронный код, где мы помещаем в D

UIStoryboard *storybord = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
UIViewController *viewController = [storybord instantiateViewControllerWithIdentifier:@"D"]; 
[self.navigationController pushViewController:viewController animated:YES]; 

Стек теперь читает A, B, C, D. Когда я поп, проблема возникает

Асинхронный код

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

      if (error) { 
       NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
       [defaults setValue:@"messagehomescreen" forKey:@"lastscreenstatus"]; 
       UIStoryboard *storybord = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
       UIViewController *viewController = [storybord instantiateViewControllerWithIdentifier:@"D"]; 
       [self.navigationController pushViewController:viewController animated:YES]; 

      } 
     }]; 
+0

Вы используете правильную вещь, чтобы вернуться к контроллеру B (насколько я могу судить). Можете ли вы показать свой код, где вы нажимаете от B до C, пожалуйста. – Fogmeister

+0

Хм ... что вы имеете в виду асинхронный? Пожалуйста, покажите весь код асинхронного нажатия. – Fogmeister

+0

@Fogmeister вы правы, я редактировал код для использования popToViewController анимированный. – suhit

ответ

-1

попробовать

BViewController *BViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"BVC"]; 
[self.navigationController pushViewController: BViewController animated:YES]; 

Edit: Да - pushviewcontroller будет добавить контроллеры на стек. Пожалуйста, не используйте его.

The - popToViewController Используется для управления контроллерами всплывающих окон. Выключение стека, вплоть до уже существующего. Но у вас есть массив контроллеров представлений в стеке, поэтому вам нужно предоставить один из них в качестве аргумента, подобного приведенному ниже.

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES]; 

Для получения дополнительной информации, пожалуйста, обратитесь к этому link.

+0

Я попытался код ниже –

+0

для (UIViewController * aViewController в allViewControllers) { если ([aViewController isKindOfClass: [messageViewController класс]]) { UIViewController * myViewController = [self.storyboard instantiateViewControllerWithIdentifier: @ "MessageView"]; [self.navigationController popToViewController: myViewController animated: YES]; } } –

+0

Это дало мне ошибку - попробовал поп-контроль контроллера, которого не существует. –

2

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

Вы не можете использовать материал UI в фоновом режиме. Все должно быть в главной теме.

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

+0

Спасибо за ответ. Можете ли вы дать мне представление, как это сделать. Я думаю, что нужно установить значение BOOL внутри асинхронного кода и после выполнения асинхронного кода на основе значения BOOL в основном потоке нажмите контроллер вида. Я прав? –

+0

Также интересно, почему NSLog стека UIViewcontoller всегда показывает желаемый результат, если в асинхронном блоке возникает ошибка. Есть идеи? –

+0

Нет, ваш код уже вернулся в основной поток. Вероятно, это связано с тем, что переход выполняется либо дважды, либо его вызывают, пока предыдущий переход все еще происходит. Поместите «NSLog» в свой код, чтобы узнать, сколько раз он вызывается. – Fogmeister

Смежные вопросы

 Смежные вопросы