web-dev-qa-db-fra.com

Swift: comment exécuter une action lorsque vous appuyez sur UITabBarItem

Actuellement, j'ai un contrôleur de barre d'onglets connecté à un contrôleur de table. J'essaie d'aller en haut de la table lorsque j'appuie sur la barre d'onglets. Je sais comment atteindre le sommet de la table. Je ne sais tout simplement pas comment effectuer une action lorsque l'élément est enfoncé.

20
K Swisha

Vous devez utiliser UITabBarDelegate avec la méthode didSelectItem. Utilisez-le comme n'importe quel délégué standard:

class yourclass: UIViewController, UITabBarDelegate {
    func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
        //This method will be called when user changes tab.
    }
}

Et n'oubliez pas de définir votre délégué de barre d'onglets sur self dans le contrôleur de vue.

28
Nikita Zernov

Voici une réponse à cette question

Fondamentalement, vous faites ceci:

  • Assurez-vous que votre contrôleur de vue est abonné à UITabBarDelegate
  • Définir des balises dans IB pour chaque élément de la barre d'onglets
  • Implémentez la méthode didSelectItem, quelque chose comme ceci:

    -(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
        if(item.tag == 1) {
           // Code for item 1
        }
        else if(item.tag == 2) {
           // Code for item 2
        }
    }
    

Cela vous donnera accès à chaque événement sélectionné de l'élément d'onglet. J'espère que ça aide!

Dans Swift:

func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    if(item.tag == 1) {
        // Code for item 1
    } else if(item.tag == 2) {
        // Code for item 2
    }
}
19
erparker

Swift 3

class yourclass: UIViewController, UITabBarDelegate {
    func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        print("Test")
    }
}

Et n'oubliez pas de définir votre délégué tabBar sur self dans viewDidLoad

override func viewDidLoad(){
    super.viewDidLoad()
    <YOUR TAB BAR NAME>.delegate = self 
}
10
Ahmed Safadi

J'avais du mal à implémenter les autres réponses ici. Ceci est une réponse plus complète. Il suppose que vous utilisez un UITabBarController (par défaut si vous créez une nouvelle application à onglets). Cette solution imprimera un message chaque fois qu'un bouton de l'onglet du contrôleur de vue est appuyé.

enter image description here

Code

Créez un nouveau fichier Swift appelé MyTabBarController.Swift . Collez le code suivant.

import UIKit

class MyTabBarController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // tell our UITabBarController subclass to handle its own delegate methods
        self.delegate = self
    }

    // called whenever a tab button is tapped
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {

        if viewController is FirstViewController {
            print("First tab")
        } else if viewController is SecondViewController {
            print("Second tab")
        }
    }
}

Générateur d'interface

Sur votre storyboard, sélectionnez le contrôleur de la barre d'onglets. Ensuite, dans l'inspecteur d'identité, définissez le nom de la classe sur MyTabBarController (c'est-à-dire le nom de la classe dans le code ci-dessus).

enter image description here

C'est tout. Vous pouvez exécuter votre application maintenant et être averti chaque fois que l'utilisateur appuie sur un élément de la barre d'onglets.

Remarques

  • Si vous devez exécuter une méthode sur un robinet, vous pouvez faire quelque chose comme ce qui suit dans la méthode didSelect.

    if let firstVC = viewController as? FirstViewController {
        firstVC.doSomeAction()
    }
    
  • Vous pouvez faire en sorte que le FirstViewController implémente le délégué et gère tout là-bas. De cette façon, vous n'auriez pas besoin de créer de sous-classe UITabBarController personnalisée et de la définir dans IB. Cependant, avoir un enfant pour faire le travail des parents semble être le mauvais endroit pour le faire. Quoi qu'il en soit, voici:

    class FirstViewController: UIViewController, UITabBarControllerDelegate {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            tabBarController?.delegate = self
        }
    
        func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
            // ...
        }
    }
    

    La méthode didSelect ci-dessus est appelée quel que soit l'onglet sélectionné.

  • UITabBarControllerDelegate documentation

7
Suragch

Une autre solution consiste à faire simplement quelque chose dans viewDidAppear dans le contrôleur de vue que l'onglet affiche.

First Tab View Controller

import UIKit
class FirstViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("First tab")
    }
}

Second Tab View Controller

import UIKit
class SecondViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("Second tab")
    }
}
4
Suragch