如何从UICollectionView Cell引用Tab Bar Controller

时间:2017-07-07 15:51:38

标签: ios swift uitabbarcontroller

我有一个标签栏控制器应用程序,在其中一个标签中有一个UI集合视图控制器,其中一个操作分配给一个按钮。此按钮具有魔力,然后应将标签栏视图更改为另一个。但是,我无法将其直接引用到标签控制器。

tabBarController是分配给控制器的类名。所以,我试过了:

tabBarController.goToIndex(3)

并直接在tabBarController类中创建方法

id

错误说明:' goToIndex'的实例成员不能在tabBarController类型上使用

任何想法?

谢谢,

1 个答案:

答案 0 :(得分:1)

通过正确引用它,我很难理解你的意思,但希望这会有所帮助。假设tabBarController是UITabBarController的子类:

class MyTabBarController: UITabBarController {

    /// ...

    func goToIndex(index: Int) {

    }
}

在其中一个标签控制器(UIViewController)中,您可以使用self.tabBarController引用您的UITabBarController。请注意,self.tabBarController是可选的。

    self.tabBarController?.selectedIndex = 3

如果您的选项卡UIViewController是UINavigationController中的UIViewController,那么您需要像这样引用标签栏:

self.navigationController?.tabBarController

要调用子类上的函数,您需要将标签栏控制器强制转换为自定义子类。

    if let myTabBarController = self.tabBarController as? MyTabBarController {
        myTabBarController.goToIndex(3)
    }

根据评论更新:

您确定无法访问单元格内的tabBarController,除非您将其作为单元格本身(不推荐)或应用程序委托的属性。或者,您可以在UIViewController上使用目标操作,以便每次在单元格内点击按钮时调用视图控制器上的函数。

class CustomCell: UITableViewCell {
    @IBOutlet weak var myButton: UIButton!
}

class MyTableViewController: UITableViewController {

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "ReuseIdentifier", for: indexPath) as! CustomCell

        /// Add the indexpath or other data as a tag that we
        /// might need later on. 

        cell.myButton.tag = indexPath.row

        /// Add A Target so that we can call `changeIndex(sender:)` every time a user tapps on the 
        /// button inside a cell.

        cell.myButton.addTarget(self,
                                action: #selector(MyTableViewController.changeIndex(sender:)),
                                for: .touchUpInside)

        return cell
    }


    /// This will be called every time `myButton` is tapped on any tableViewCell. If you need
    /// to know which cell was tapped, it was passed in via the tag property.
    ///
    /// - Parameter sender: UIButton on a UITableViewCell subclass. 

    func changeIndex(sender: UIButton) {

        /// now tag is the indexpath row if you need it.
        let tag = sender.tag

        self.tabBarController?.selectedIndex = 3
    }
}