我有一个带标题的UICollectionView。我在这个标题按钮中添加了
然后我为这个UICollectionReusableView
类型的标题创建了一个类。然后我尝试在类型UICollectionReusableView
但是,当我写这行时,我得到了错误
@IBAction func goToMovie(_ sender: AnyObject) {
let st = self.storyboard?.instantiateViewController(withIdentifier: "aaa") as! aaa
self.navigationController?.pushViewController(st, animated: true)
}
错误消息:value of type 'className' has no member 'storyboard'
如何通过此按钮转到其他视图?
答案 0 :(得分:2)
您收到的错误是因为UICollectionReusableView
没有storyboard
属性。它也没有navigationController
属性。
您不需要在可重用视图中执行转换,而是从包含它的viewController执行转换。为了做到这一点,你需要一个自定义委托或一个回调块,以告诉视图控制器标题被点击并触发推送。
使用阻止/关闭/回调:
在可重复使用的视图中添加完成闭包:
var completion: (() -> Void)?
接下来,在你的goToMovie
func中删除这两行并添加,然后调用这样的闭包:
completion?()
然后在您声明标题的视图控制器中触发转换,如下所示:
. . .
headerView.completion = {
let storyboard = UIStoryboard(name: "WhateverYourSBNameIs", bundle: nil)
let aaaVC = storyboard.instantiateViewController(withIdentifier: "WhateverYourIdentifierIs") as! AAAViewController
self.navigationController?.pushViewController(st, animated: true)
}
使用自定义代理
创建协议:
protocol HeaderDelegate {
func headerTapped(sender: UICollectionReusableView)
}
然后在标题中添加委托属性
var delegate: HeaderDelegate?
然后当你声明标题时:
. . .
header.delegate = self
. . .
然后使视图控制器符合委托:
extension ViewController: HeaderDelegate {
func headerTapped(sender: UITableViewCell) {
let storyboard = UIStoryboard(name: "WhateverYourSBNameIs", bundle: nil)
let aaaVC = storyboard.instantiateViewController(withIdentifier: "WhateverYourIdentifierIs") as! AAAViewController
self.navigationController?.pushViewController(st, animated: true)
}
}
如果视图控制器不需要知道哪个标题被点击,您可以从委托功能中删除sender: UITableViewCell
参数。
希望这会有所帮助。我个人会使用关闭FWIW。