我通过在我的自定义UICollectionViewCell
中创建一个协议,并将这些事件委托回UIViewController
来实现这一点,就像这样:
在你的MyCollectionViewCell
中
protocol MyCollectionViewCellDelegate: AnyObject {
func didLongPressCell()
}
class MyCollectionViewCell: UICollectionViewCell {
weak var delegate: MyCollectionViewCellDelegate?
func longPressAction() {
if let del = self.delegate {
del.didLongPressCell
}
}
}
然后回到你的 MyViewController
中
class MyViewController: UIViewController, MyCollectionViewCellDelegate {
func collectionView(
collectionView: UICollectionView,
cellForItemAtIndexPath indexPath: NSIndexPath
) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! MyCollectionViewCell
cell.delegate = self
return cell
}
func didLongPressCell() {
}
}
需要记住的重要部分是:
为每个单元格设置委托
cell.delegate = self
将委托引用设置为弱引用,以避免潜在的保留循环
weak var delegate: MyCollectionViewCellDelegate?
在您想要接收事件的视图控制器中采用新协议
class MyViewController:UIViewController, MyCollectionViewCellDelegate
编辑:如果你已经创建了UICollectionView
的子类,那么请传递一个指向视图控制器的引用,这样你就可以像下面这样使用它。
现在你的MyViewController
将会是这个样子
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let collectionView = MyCollectionView()
collectionView.viewController = self
self.view.addSubview(collectionView)
}
}
还有你自定义的集合视图MyCollectionView
class MyCollectionView: UICollectionView, MyCollectionViewCellDelegate {
weak var viewController: UIViewController?
func collectionView(
collectionView: UICollectionView,
cellForItemAtIndexPath indexPath: NSIndexPath
) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! MyCollectionViewCell
cell.delegate = self
return cell
}
func didLongPressCell() {
if let vc = self.viewController {
}
}
}
UICollectionViewCell
与之前相同
UICollectionView
子类化以持有一个weak delegate: UIViewController?
字段,并在视图控制器中使用collectionView.delegate = self
。然后您可以使用委托进行演示。 - sdasdadas