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")
}
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
}
}
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) {}
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
}
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
}
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)
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);
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] {
}
}
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.