我有一个包含collectionView的视图控制器:
class TagViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
@IBOutlet weak var collectionView: UICollectionView!
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return posts.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let post = posts[indexPath.row]
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! SNPostViewCell
cell.isVideo = post.isVideo
cell.mediaURL = URL(string: post.mediaURL)
cell.backgroundColor = UIColor.black
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let post = posts[indexPath.row]
if post.isVideo == true {
self.performSegue(withIdentifier: "playVideo", sender: nil)
} else {
print("is image. might go full screen one day here")
}
let bin = self.bins[post.timeStamp]
print(bin)
}
override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { //Error: method cannot override from its superclass
<#code#>
}
}
虽然我可以覆盖那些collectionView函数,但似乎要覆盖scrollViewDidEndDecelerating我特别需要有一个collectionView实例(而不是在视图控制器中执行)
好的,所以我做了一个自定义的collectionView,它继承自collectionViewController。这会正确覆盖scrollViewDidEndDecelerating(该方法现在从其超类中覆盖),并且我在其中使用代码来查找当前单元格的索引,
class PagingCollectionViewController: UICollectionViewController {
...
override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if (self.collectionView.contentOffset.y < 0) {
self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x, 0.0);
}
for cell in yourCollectionViewname.visibleCells() as [UICollectionViewCell] {
let indexPath = yourCollectionViewname.indexPathForCell(cell as UICollectionViewCell)
}
}
...
}
但是,你可以看到这需要引用我不会在类中定义的collectionView的当前索引吗?仅在创建和填充实例的控制器视图中...
所以我真的不知道在哪里放置这个覆盖scrollViewDidEndDecelerating函数以及如何成功访问其中的数据 - 找到索引。
答案 0 :(得分:4)
这是错误的:
override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
<#code#>
}
...因为scrollViewDidEndDecelerating
不是 override
方法。它是委托方法。
因此,请删除override
一词,并将self
设为delegate
的{{1}},然后您就完成了设置。