2015-06-07 12 views
10

vorrei sapere come si fa a rilevare quando il selezionato TabBar Item o indice è cambiato quandocambia è fatto di programmazione?Rileva UITabBar variazioni dell'indice selezionato/elemento che è impostato a livello di programmazione

self.tabBarController.selectedIndex = 1; 

Questa funzione di due delegati rileva solo le modifiche quando l'elemento TabBar è stato selezionato dall'utente. Non si attiva quando le modifiche all'Indice selezionato sono state eseguite a livello di programmazione.

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

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

risposta

6

risposte precedenti sono sufficienti per "rilevare" i cambiamenti, ma lo fa non rilevare quale indice viene premuto.

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

self.selectedIndex non restituirà l'indice selezionato subito. Per controllare quale articolo è stato premuto, avremmo bisogno di confrontare la voce con i tabBarItems nel nostro 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 
    } 
} 
0

Ho trovato una soluzione deliziosa a questo. Grazie a Ckouta per l'idea.

ho semplicemente creare una funzione per modificare l'indice e fuoco il protocollo delegato del didSelectItem di UITabBar

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

utilizzo

selectItemWithIndex(1); 
1

che non può essere fatto, ma una sorta di hacking può essere fatto e io sono sicuro che è sarà una soluzione temporanea per questo problema. override sotto il metodo per tabbarcontrollerdelegate fare le tue cose all'interno di questo viene chiamato quando la scheda viene commutato in entrambi i modi in modo programmatico o toccando sulla voce della barra delle schede.

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 
} 
0

Mi importava solo dell'Index selezionato in uno dei VC nello stack del controller della barra delle schede. Così I KVO: ed segmentedIndex sull'istanza tabbarcontroller da quel VC. Funziona bene, nessun problema reale.

0

Swift 3

Ecco una versione un po 'più sicura Swift-3, di ciò che è stato proposto in precedenza:

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) 
0

In modo rapido, è possibile farlo ignorando la proprietà selectedIndex di UITabBarController.

Prima sottoclasse UITabBarController e aggiungere tutto il codice seguente.

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

aggiungere anche questo metodo delegato di 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) 
} 

Infine, chiamiamo questo metodo da entrambi i luoghi in modo che siano trattati tutti i casi.

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

Lungo tutte le risposte qui, se si sottoclassato UITabBarController già, ecco una soluzione semplice per tutte le modifiche barra delle schede (avviate utente e programmatiche):

// 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) {} 
Problemi correlati