Swift:如何在按下UITabBarItem时执行操作

K S*_*sha 21 uitabbarcontroller ios swift

目前我有一个连接到tableview控制器的标签栏控制器.当我按下标签栏项目时,我正试图转到桌面视图的顶部.我知道如何到达tableview的顶部.我只是不知道如何在按下项目时执行操作.

Nik*_*nov 28

你应该使用UITabBarDelegate方法didSelectItem.将它用作任何标准委托:

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

并且不要忘记将标签栏委托设置self为视图控制器.

  • 感谢您的回答,但我们如何才能将标签栏委托设置为自己? (2认同)
  • tabBar.delegate = self如果现在可以帮助您,或者其他人以防万一。 (2认同)

erp*_*ker 19

这是这个问题的答案

基本上你这样做:

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

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

这将使您可以访问每个标签项目分接事件.希望能帮助到你!


Ahm*_*adi 10

SWIFT 3

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

并且不要忘记在viewDidLoad中将tabBar委托设置为self

override func viewDidLoad(){
    super.viewDidLoad()
    <YOUR TAB BAR NAME>.delegate = self 
}
Run Code Online (Sandbox Code Playgroud)


Sur*_*gch 7

我在这里实施其他答案时遇到了麻烦.这是一个更全面的答案.它假设您使用的是UITabBarController(默认情况下,如果您创建一个新的选项卡式应用程序).每次点击视图控制器选项卡按钮时,此解决方案都将打印一条消息.

在此输入图像描述

创建一个名为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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Interface Builder

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

在此输入图像描述

就这样.您可以立即运行您的应用,并在用户点击标签栏项目时收到通知.

笔记

  • 如果您需要在点击上运行方法,那么您可以在didSelect方法中执行以下操作.

    if let firstVC = viewController as? FirstViewController {
        firstVC.doSomeAction()
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以将FirstViewController实现作为委托并处理其中的所有内容.这样你就不需要制作任何自定义UITabBarController子类并在IB中设置它.然而,让孩子做父母的工作似乎是错误的地方.无论如何,这是:

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

    didSelect无论点击哪个标签,上面的方法都会被调用.

  • UITabBarControllerDelegate 文件


Sur*_*gch 5

另一种解决方案是viewDidAppear在选项卡显示的任何View Controller中执行操作。

第一个选项卡视图控制器

import UIKit
class FirstViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("First tab")
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个标签视图控制器

import UIKit
class SecondViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("Second tab")
    }
}
Run Code Online (Sandbox Code Playgroud)