web-dev-qa-db-fra.com

Détecter les modifications d'index/d'élément UITabBar sélectionnées définies par programme

Je voudrais savoir comment nous détectons quand l'élément ou la barre de tabulation sélectionné est modifiéwhenles modifications sont effectuées par programme

self.tabBarController.selectedIndex = 1;

Cette fonction de deux délégués détecte uniquement les modifications lorsque l'élément TabBar a été sélectionné par l'utilisateur. Il ne se déclenche pas lorsque les modifications apportées à selectedIndex ont été effectuées par programme.

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
    println("tabBarController didSelectViewController")
}

override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) {
    println("tabBar didSelectItem")
}
14
JayVDiyk

Les réponses précédentes sont suffisantes pour "détecter" les modifications, mais il ne détecte pas quel index est utilisé.

func selectItemWithIndex(value: Int) {
    self.tabBarControllertabBarController.selectedIndex = value;
    self.tabBar(self.tabBar, didSelectItem: (self.tabBar.items as! [UITabBarItem])[value]);
}

self.selectedIndex ne retournera pas l'index sélectionné immédiatement. Pour vérifier quel élément est en cours d'utilisation, nous devons comparer l'élément avec les tabBarItems dans notre UITabBarController

override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) {
    if item == (self.tabBar.items as! [UITabBarItem])[0]{ 
       //Do something if index is 0
    }
    else if item == (self.tabBar.items as! [UITabBarItem])[1]{
       //Do something if index is 1
    }
}
12
Eddy Liu

Avec toutes les réponses ici, si vous avez déjà sous-classé UITabBarController, voici une solution simple pour tous les changements de barre d’onglet (initié par l’utilisateur et programmatique):

// Override selectedViewController for User initiated changes
override var selectedViewController: UIViewController? {
    didSet {
        tabChangedTo(selectedIndex: selectedIndex)
    }
}
// Override selectedIndex for Programmatic changes    
override var selectedIndex: Int {
    didSet {
        tabChangedTo(selectedIndex: selectedIndex)
    }
}

// handle new selection
 func tabChangedTo(selectedIndex: Int) {}
5
Meseery

Dans Swift, vous pouvez le faire en remplaçant la propriété selectedIndex par UITabBarController.

Première sous-classe UITabBarController et ajoutez tout le code suivant.

//Overriding this to get callback whenever its value is changes
   override var selectedIndex: Int {
      didSet {
         handleTabSelection(selectedIndex: selectedIndex)
      }
   }

Ajoutez également cette méthode déléguée de UITabBarControllerDelegate

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    //Tab tapped
    guard let viewControllers = tabBarController.viewControllers else { return }
    let tappedIndex = viewControllers.index(of: viewController)! 
    //Tab tapped at tappedIndex
    handleTabSelection(selectedIndex: tappedIndex)
}

Enfin, nous appelons cette méthode depuis les deux emplacements afin que tous les cas soient traités.

private func handleTabSelection(selectedIndex: Int) {
    //Do something on tab selection at selectedIndex
}
2
Vineet Ashtekar

cela ne peut pas être fait mais une sorte de piratage peut être fait et je suis sûr que ce sera une solution temporaire à ce problème . manière programmée ou en tapant sur l’élément de la barre d’onglet.

func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
{
    toVC.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.fontFuturaMedium11, NSForegroundColorAttributeName: UIColor.colorAppThemeColor], for: .normal)
    fromVC.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.fontFuturaBTBook11, NSForegroundColorAttributeName: UIColor.colorStudentTabText], for: .normal)
    return nil
}
1
Amit Saxena

Swift 3

Voici une version un peu plus sûre de Swift-3, de ce qui a été proposé ci-dessus:

func selectItem(withIndex index: Int) {

    if  let controller = tabBarController,
        let tabBar = tabBarController?.tabBar,
        let items = tabBarController?.tabBar.items
    {
        guard index < items.count else { return }

        controller.selectedIndex = index
        controller.tabBar(tabBar, didSelect: items[index])
    }
}

UITabBarController:

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    if let items = tabBar.items {
        items.enumerated().forEach { if $1 == item { print("your index is: \($0)") } }
    }
}

Usage:

selectItem(withIndex: 1)
1
jeff-ziligy

J'ai trouvé une belle solution à cela. Merci à Ckouta pour l'idée. 

Je crée simplement une fonction permettant de modifier l'index et d'activer le protocole de délégué de didSelectItem

func selectItemWithIndex(value: Int) {
    self.tabBarControllertabBarController.selectedIndex = value;
    self.tabBar(self.tabBar, didSelectItem: (self.tabBar.items as! [UITabBarItem])[value]);
}

Usage

    selectItemWithIndex(1);
0
JayVDiyk

Swift 4: - Vous devez utiliser ces lignes de code pour détecter l'index d'élément sélectionné par UITabBar.

func tabBar (_ tabBar: UITabBar, élément didSelect: UITabBarItem) {

    if item == (tabBar.items)![0] {

    }
    else if item == (tabBar.items)![1] {

    }
}
0
V.Kumar

Je me souciais seulement de selectedIndex dans l'un des VC de la pile de contrôleurs de la barre d'onglets. Donc, je KVO: ed segmentedIndex sur l'instance de tabbarcontroller de ce VC. Fonctionne bien, pas de problèmes réels.

0
Jonny