it-swarm.com.ru

Переход к корневому представлению при выборе вкладки

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

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

15
John S

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

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

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

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

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

25
ios developer

Для любителей 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);
            }
    }
}

Edit: Swift 3 обновление, спасибо @Justin Oroz за указание на это.

10
Evdzhan Mustafa

В Swift 3.1

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

class YourClass: UITabBarController, UITabBarControllerDelegate {

После:

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

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

}

4
ElvinM

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

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

3
Robin Summerhill
[self.navigationController popToRootViewControllerAnimated:NO];
2
Lefteris

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
Stewart Lynch

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

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

0
delrox

Во-первых, вы должны создать подкласс 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];
            }
        }
    }
}
0
tk su92work

Ниже работал для меня. Этот код в 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
Chandramani