2015-09-07 5 views
3

Контекст:popToRootViewController, когда другой выбрана вкладка

Я использую TabViewController и NavigationController одновременно. Две вкладки: RECENT и POPULAR, и они показывают список сообщений. Представьте, что вы находитесь на вкладке RECENT и щелкните сообщение, и вы переходите в вид postsShow. Итак, вы один глубже в стеке навигации. Когда вы переходите на вкладку POPULAR и возвращаетесь на вкладку RECENT, вы по-прежнему видите сообщение, которое вы нажали раньше. Но вместо этого я хочу показать список сообщений.

То, что я пытаюсь:

Я устанавливаю PostsShowViewController в TabBarControllerDelegate и при выборе вкладки элемент, я пытаюсь совать его просмотра корневой контроллер. Затем, когда пользователь вернется, он увидит rootViewController, который является списком сообщений, а не представлением PostsShow.

Код:

viewDidAppear self.tabBarController.delegate = self;

viewDidDisappear self.tabBarController.delegate = nil;

Заголовок UITabBarControllerDelegate

- (BOOL) tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { 
    [self.navigationController popToRootViewControllerAnimated:NO]; 
    return YES; 
} 

Как это не работает:

  1. Перейти к недавней вкладке
  2. Нажмите на публикацию, чтобы перейти к виду PostsShow
  3. Перейти к популярной вкладке
  4. Вернуться назад в последнее время (я ожидаю увидеть список сообщений вместо просмотра PostsShow)
  5. Ошибка! EXC_BAD_ACCESS

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

Код

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{ 
    UINavigationController *navigation = (UINavigationController*) viewController; 
    [navigation popToRootViewControllerAnimated:NO]; 
} 
  1. перейти к недавней закладке
  2. нажмите сообщение, чтобы перейти к PostsShowview
  3. перейти к популярной вкладке
  4. вернуться к недавней закладке
  5. я вижу список сообщений (без ошибок!)
  6. вернитесь к популярной вкладке: ERR_BAD_ACCESS!

EDIT: это моя раскадровки enter image description here

EDIT2:

полный стек след:

* thread #1: tid = 0x4a37c, 0x0000000197bb7bd0 libobjc.A.dylib`objc_msgSend + 16, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x10) 
    frame #0: 0x0000000197bb7bd0 libobjc.A.dylib`objc_msgSend + 16 
    frame #1: 0x000000018ab52078 UIKit`-[UITabBarController _tabBarItemClicked:] + 104 
    frame #2: 0x000000018a9891ec UIKit`-[UIApplication sendAction:to:from:forEvent:] + 96 
    frame #3: 0x000000018ab51fb4 UIKit`-[UITabBar _sendAction:withEvent:] + 468 
    frame #4: 0x000000018a9891ec UIKit`-[UIApplication sendAction:to:from:forEvent:] + 96 
    frame #5: 0x000000018a9722c8 UIKit`-[UIControl _sendActionsForEvents:withEvent:] + 612 
    frame #6: 0x000000018ab51bec UIKit`-[UITabBar(Static) _buttonUp:] + 128 
    frame #7: 0x000000018a9891ec UIKit`-[UIApplication sendAction:to:from:forEvent:] + 96 
    frame #8: 0x000000018a9722c8 UIKit`-[UIControl _sendActionsForEvents:withEvent:] + 612 
    frame #9: 0x000000018a988b88 UIKit`-[UIControl touchesEnded:withEvent:] + 592 
    frame #10: 0x000000018a947da8 UIKit`_UIGestureRecognizerUpdate + 8536 
    frame #11: 0x0000000185e8fff0 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32 
    frame #12: 0x0000000185e8cf7c CoreFoundation`__CFRunLoopDoObservers + 360 
    frame #13: 0x0000000185e8d35c CoreFoundation`__CFRunLoopRun + 836 
    frame #14: 0x0000000185db8f74 CoreFoundation`CFRunLoopRunSpecific + 396 
    frame #15: 0x000000018f8136fc GraphicsServices`GSEventRunModal + 168 
    frame #16: 0x000000018a9bad94 UIKit`UIApplicationMain + 1488 
    * frame #17: 0x0000000100023ff4 toaster-objc`main(argc=1, argv=0x000000016fdeba50) + 124 at main.m:14 
    frame #18: 0x000000019824ea08 libdyld.dylib`start + 4 
+0

Что такое иерархия? TabBarViewController -> NavigationController? – Miknash

+0

@NickCatib Да. Каждый tabItem подключается к NavigationController. –

+0

см. Эту ссылку может помочь вам http://stackoverflow.com/questions/21017985/call-poptorootviewcontroller-from-another-tab –

ответ

3

Вот как я это сделал в стрижа:

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { 

    self.tabBarSelectedIndex = tabBarController.selectedIndex 
    var navigation = viewController as! UINavigationController 
    navigation.popToRootViewControllerAnimated(false) 
    // rest of the logic 
} 

Похожие в Objective-C:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 
    self.tabBarSelectedIndex = tabBarController.selectedIndex; 
    UINavigationController *navigation = (UINavigationController*) viewController; 
    [navigation popToRootViewControllerAnimated:NO]; 
} 

Обратите внимание, что я использовал метод didSelectViewController для UITabBarController.

Вы можете проверить это here:

+0

Спасибо за ваш ответ Пожалуйста, см. Мой обновленный вопрос. –

+0

Это может произойти из-за того, что у вас есть UINavigationController на одной, а не на другой вкладке. Вы можете сделать это только для определенного selectedIndex, т. Е. If (tabBarController.selectedIndex == 0), который используется для навигации и поп-музыки. – Miknash

+0

Кроме того, вы можете включить контрольную точку исключения, чтобы быть уверенным, где она сбой. – Miknash

0

Попробуйте:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{ 

if ([viewController isKindOfClass:[UINavigationController class]]) 
{ 
    UINavigationController *navController = (UINavigationController *)viewController; 

    [navController popToRootViewControllerAnimated:NO]; 

} 
} 
+0

Спасибо за ваш ответ. См. Мой обновленный вопрос. –

+0

Возможно, у вас нет навигационного контроллера на популярной вкладке. Пожалуйста, попробуйте добавить ниже, если условие, как я упомянул в своем ответе if ([viewController isKindOfClass: [UINavigationController class]]) – coder1010

+0

Я делаю (см. Обновленный вопрос), и я также попытался добавить условие :( –

0
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
{ 
    if ([viewController isKindOfClass:[UINavigationController class]]) { 
     [(UINavigationController *)viewController popToRootViewControllerAnimated:YES]; 
    } 
} 
Смежные вопросы