Swift:如何在UITabBarItem被按下时执行一个动作

目前我有一个连接到桌面视图控制器的选项卡栏控制器。 我正在试图去当我按下标签栏项目的桌面视图的顶部。 我知道如何到达桌面的顶部。 我只是不知道如何做一个动作,当项目被按下。

你应该使用方法didSelectItem使用UITabBarDelegate 。 使用它作为任何标准的代表:

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

而且不要忘了在视图控制器中设置你的标签栏代表self

这是对这个问题的答案

基本上你这样做:

  • 确保你的视图控制器订阅了UITabBarDelegate
  • 在IB中为每个标签栏项目设置标签
  • 实现didSelectItem方法,如下所示:

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

这会让你访问每个标签项目点击事件。 希望能帮助到你!

SWIFT 3

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

不要忘记在viewDidLoad中设置你的tabBar委托

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

我在这里执行其他答案时遇到了麻烦。 这是一个更完整的答案。 它假定您正在使用UITabBarController (默认情况下,如果您创build一个新的选项卡式应用程序)。 每次点击视图控制器选项卡button时,此解决scheme将打印一条消息。

在这里输入图像说明

创build一个名为MyTabBarController.swift的新Swift文件。 粘贴下面的代码。

 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") } } } 

界面生成器

在故事板上select标签栏控制器。 然后在身份检查器中,将类名设置为MyTabBarController (即上面代码中类的名称)。

在这里输入图像说明

就这样。 您现在可以运行您的应用程序,并在用户点击标签栏项目时收到通知。

笔记

  • 如果你需要在水龙头上运行一个方法,那么你可以在didSelect方法中做如下的事情。

     if let firstVC = viewController as? FirstViewController { firstVC.doSomeAction() } 
  • 你可以做FirstViewController实现委托并处理所有的事情。 这样你就不需要做任何自定义的UITabBarController子类,并在IB中设置它。 但是,生孩子,父母的工作似乎是错误的地方。 无论如何,这里是:

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

    上面的didSelect方法被调用,不pipe哪个标签被点击。

  • UITabBarControllerDelegate文档

另一种解决scheme是在viewDidAppear中selectView Controller中的任何一个。

第一个标签视图控制器

 import UIKit class FirstViewController: UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) print("First tab") } } 

第二个标签视图控制器

 import UIKit class SecondViewController: UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) print("Second tab") } }