Воспроизведение в корневом режиме при выборе вкладки

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

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

Ответы

Ответ 1

Вызывается вызывающий делегат, когда каждая вкладка выбрана на вкладке.

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

Поместите следующий код внутри этого метода делегата.

if ([viewController isKindOfClass:[UINavigationController class]]) 
    {
        [(UINavigationController *)viewController popToRootViewControllerAnimated:NO];
    }

работает на моем приложении.

Ответ 2

Для любителей Swift:

import UIKit

class YourTabBarControllerHere: UITabBarController,
UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self;
    }

    func tabBarController(tabBarController: UITabBarController,
        didSelectViewController viewController: UIViewController) {
            if let vc = viewController as? UINavigationController {
                vc.popViewControllerAnimated(animated: false);
            }
    }
}

Изменить: Обновление Swift 3 благодаря @Justin Oroz для указания на это.

Ответ 3

В Swift 3.1

Добавьте UITabBarControllerDelegate в свой класс TabBar:

класс YourClass: UITabBarController, UITabBarControllerDelegate {

После:

переопределить func tabBar (tabBar: UITabBar, didSelectItem item: UITabBarItem) {

let yourView = self.viewControllers![self.selectedIndex] as! UINavigationController
yourView .popToRootViewControllerAnimated(false) 

}

Ответ 4

То, что вы пытаетесь сделать, звучит немного странно. Прочитали ли вы Руководство по интерфейсу пользователя по объединению UINavigationControllers и UITabBarControllers?

Однако вам нужно определить выбор вкладки, установив делегат для вашего UITabBarController и внедряя метод tabBarController: didSelectViewController: delegate. В этом методе вам нужно вернуться в контроллер корневого представления с помощью метода UINavigationController popToRootViewControllerAnimated:.

Ответ 5

[self.navigationController popToRootViewControllerAnimated:NO];

Ответ 6

Swift 4.2

Решение, которое работает для меня, состоит в том, чтобы создать подкласс UITabBarController и добавить две функции делегата следующим образом:

import UIKit

class MyCustomTabBarController: UITabBarController, UITabBarControllerDelegate {
    var previousSelectedTabIndex:Int = 0

override func viewDidLoad() {
    super.viewDidLoad()
    self.delegate = self
}

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    self.previousSelectedTabIndex = tabBarController.selectedIndex
}


override func tabBar(_ tabBar: UITabBar, didSelect item:
    UITabBarItem) {
    let vc = self.viewControllers![previousSelectedTabIndex] as! UINavigationController
    vc.popToRootViewController(animated: false)

}

}

Убедитесь, что вы установили для анимированного значение false, иначе вы получите

 Unbalanced calls to begin/end appearance transitions for the targeted ViewController

Ответ 7

Попробуй это.

class TabBarClass: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        let vc = self.viewControllers![selectedIndex] as! UINavigationController
        vc.popToRootViewController(animated: false)
    }
}

Ответ 8

Сначала вы должны создать подкласс UITabbarController и добавить Observer:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tabBar addObserver:self forKeyPath:@"selectedItem" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
}

Когда выбран таблетка, мы обработаем метод:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if ([keyPath isEqualToString:@"selectedItem"] && [object isKindOfClass:[UITabBar class]]){
        UITabBar *bar = (UITabBar *)object; // The object will be the bar we're observing.
        // The change dictionary will contain the previous tabBarItem for the "old" key.
        UITabBarItem *wasItem = [change objectForKey:NSKeyValueChangeOldKey];
        NSUInteger was = [bar.items indexOfObject:wasItem];
        // The same is true for the new tabBarItem but it will be under the "new" key.
        UITabBarItem *isItem = [change objectForKey:NSKeyValueChangeNewKey];
        NSUInteger is = [bar.items indexOfObject:isItem];
        if (is == was) {
           UIViewController *vc = self.viewControllers[is];
            if ([vc isKindOfClass:[UINavigationController class]]) {
                [(UINavigationController *)vc popToRootViewControllerAnimated:YES];
            }
        }
    }
}

Ответ 9

UTabController предлагает другой UX для того, чтобы позволить пользователю "поп-сервер". При переходе на вкладку он сохраняет весь UINav-стек. Если они нажимают на элемент панели второй раз (нажатие на выбранную вкладку), только тогда он появляется до корня. Это все автоматическое. Некоторые приложения, такие как instagram, позволяют третьему нажатию прокручивать вверх.

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

Ответ 10

Ниже я работал у меня. Этот код в быстром 3:

1 > подкласс UITabbarController и реализовать два метода ниже с помощью одного iVAr:
  class MyTabBarController: UITabBarController ,UITabBarControllerDelegate { var previousSelectedTabIndex : Int = -1 }

2 > установите делегат tabbar в viewdidLoad

override func viewDidLoad() {    
    super.viewDidLoad()
    self.delegate = self    // you must do it}  

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {

    self.previousSelectedTabIndex = tabBarController.selectedIndex
}     
func tabBarController(_ tabBarController: UITabBarController,
                               shouldSelect viewController: UIViewController) -> Bool {    

    if  self.previousSelectedTabIndex == tabBarController.selectedIndex {
        let   nav  =  viewController as! UINavigationController // mine in nav_VC
        for vc in nav.childViewControllers {
            if vc is YUOR_DESIRED_VIEW_CONTROLLER {
            nav.popToViewController(vc, animated: true)
            return false// IT WONT LET YOU GO TO delegate METHOD
            }
        }
    }
 return true
}    

tabBarController.selectedIndex дает вам выбранную вкладку

В методе tabBarController_shouldSelect_viewController вы можете установить желаемый контроллер просмотра с помощью простого расчета.
если вы не получаете вышеприведенный код с обоими методами выше, и вы узнаете, как обе работают вместе

Ответ 11

Используйте выбранный контроллер представления для popToRootViewController. В основном вам нужно разыграть этот экземпляр.

Swift

((selectedViewController) as! UINavigationController).popToRootViewController(animated: false)
//
// I just added extra line so the scroll bar won't annoy you.