Переход к корневому представлению при выборе вкладки - PullRequest
18 голосов
/ 04 октября 2011

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

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

Ответы [ 10 ]

26 голосов
/ 13 сентября 2012

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

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

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

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

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

10 голосов
/ 13 апреля 2016

Для любителей 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 за указание на это.

4 голосов
/ 08 июня 2017

В Swift 3.1

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

класс YourClass: UITabBarController, UITabBarControllerDelegate {

После:

1010 *

переопределить функцию tabBar (tabBar: UITabBar, didSelectItem item: UITabBarItem) {

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

}

3 голосов
/ 04 октября 2011

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

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

2 голосов
/ 04 октября 2011
[self.navigationController popToRootViewControllerAnimated:NO];
1 голос
/ 03 января 2019

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)

}

}

Убедитесь, что вы установили анимированный на ложь, иначе вы получите

 Unbalanced calls to begin/end appearance transitions for the targeted ViewController
0 голосов
/ 08 марта 2019

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

Swift

((selectedViewController) as! UINavigationController).popToRootViewController(animated: false)
//
// I just added extra line so the scroll bar won't annoy you.
0 голосов
/ 19 января 2017

У меня сработало нижеприведенное. Этот код в swift 3:

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

2> установить делегат панели вкладок в 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 вы можете установить желаемый контроллер представления с помощью простых вычислений. если вы не получаете приведенный выше код, поиграйтесь с обоими вышеуказанными методами и узнаете, как оба работают вместе

0 голосов
/ 06 августа 2016

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

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

0 голосов
/ 04 июня 2016

Во-первых, вы должны создать подкласс 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];
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...