在UITabBarController中检测选项卡的轻击

4
我已经按照以下方式通过编程创建了一个tabBarController:
let tabbarController = UITabBarController()
    let homeViewController = HomeViewController()
    let rewardsViewController = RewardsViewController()
    let moreViewController = NewMoreViewController()

    let homeNVc = UINavigationController()
    homeNVc.viewControllers = [homeViewController]

    let rewardsNVc = UINavigationController()
    rewardsNVc.viewControllers = [rewardsViewController]

    let moreNVc = UINavigationController()
    moreNVc.viewControllers = [moreViewController]

    tabbarController.viewControllers = [homeNVc, rewardsNVc, moreNVc]

    tabbarController.tabBar.items![0].title = NSLocalizedString("Dashboard", comment: "")
    tabbarController.tabBar.items![1].title = NSLocalizedString("Prämien", comment: "")
    tabbarController.tabBar.items![2].title = NSLocalizedString("Mehr", comment: "")
    self.window?.rootViewController = tabbarController
}

一切正常。我可以完美地浏览标签,现在我的homeViewController里有一个tableView。每当用户点击TabBarController的第一个选项卡时,我都想重新加载tableView。即使用户已经在那个视图控制器上,我也想重新加载tableView。

基本上,我如何检测用户是否点击了第一个视图控制器?

请指导我,谢谢:-)

5个回答

7
在您的homeViewController中,您可能需要实现此委托方法:
func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {

    //ask where it is first tab bar item 
    if self.tabBarController?.selectedIndex == 0 {
        // your action, e.g.:
        self.tableView.reloadData()
    }

}

注意:

您需要像这样维护您的类:

a)

class YourTabBarController: UITabBarController { // inherit from UITabBarController

或者这样: b)
class YourViewController: UIViewController, UITabBarDelegate { // set protocol

我为Swift 3编写了这段代码,因此如果您复制粘贴,可能需要更正一些语句。 - pedrouan
self.tabBarController?.selectedIndex 对我来说是关键点,因为 didSelectItem 没有被调用,所以我使用了 didSelectViewController。这样可以吗? - Byte

4

调用UITabBarControllerDelegate并实现此方法

func tabBarController(tabBarController: UITabBarController,   didSelectViewController viewController: UIViewController){

}

1
我该如何检测哪个选项卡被点击了? - Byte
每个选项卡都附有一个视图控制器。在您的问题中,您写道“基本上我如何检测用户点击了第一个视图控制器?”因此,在此方法中,您将获得视图控制器。您可以检查视图控制器或其标识符、标题等。 - Sofeda

1

请实现以下委托方法:

func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {

        if item.title == "first tab name"{
            //Do your thing
    }

我已经实现了这个方法,但它没有被调用。但didSelectViewController被调用了。 - Byte
不安全将其与标题进行测试。这不是正确的规范。 - pedrouan

1
我最近写了类似的东西。为了保持一致性,我为每个选项卡创建了一个基类BaseTabBarViewController。但是请注意,如果一个选项卡是导航控制器,那么继承自BaseTabBarViewController的将是根视图控制器。 这个基类实现了UITabBarControllerDelegate协议。在viewDidLoad中,我们将其标记为代理。 在代理方法中(Objective-C中,Swift 3中相当相似):
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {


if (tabBarController.selected == 0)
{
   // do what you need

将其更改为 if (tabBarController.selectedIndex == 0)。没有名为 .selected 的属性。 - ekashking

0
要获取哪个tabBarItem被点击了,可以在你的UITabBarController自定义类中重写以下函数。 Swift:
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
   guard let index = tabBar.items?.index(of: item) else { return }

   // Do something with the index
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接