我有一个标签栏控制器应用程序,在其中一个标签中有一个UI集合视图控制器,其中一个操作分配给一个按钮。此按钮具有魔力,然后应将标签栏视图更改为另一个。但是,我无法将其直接引用到标签控制器。
tabBarController是分配给控制器的类名。所以,我试过了:
tabBarController.goToIndex(3)
并直接在tabBarController类中创建方法
id
错误说明:' goToIndex'的实例成员不能在tabBarController类型上使用
任何想法?
谢谢,
答案 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
}
}