标题中的按钮用于推送新视图控制器

时间:2016-12-05 20:09:59

标签: ios swift uicollectionview

我有一个带标题的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'

如何通过此按钮转到其他视图?

1 个答案:

答案 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。