bugfix> ios > 投稿

collectionViewを含むView Controllerがあります。

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のインスタンスが必要なようです(View Controllerでインスタンスを実行しないでください)

それでは、collectionViewControllerを継承するカスタムcollectionViewを作成しました。これは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の現在のインデックスを参照する必要がありますか?インスタンスが作成され、データが入力されるView Controllerでのみ...

だから、このオーバーライドscrollViewDidEndDecelerating関数を配置する場所と、その中のデータに正常にアクセスする方法-インデックスを見つける方法を本当に理解していません。

回答 1 件
  • これは間違っています:

    override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        <#code#>
    }
    
    

    ...なぜなら、 scrollViewDidEndDecelerating  はじゃない  override  方法。それは委任する 方法。

    https://developer.apple.com/documentation/uikit/uiscrollviewdelegate/1619417-scrollviewdidenddecelerating

    単語 override を削除します 、および self を設定  として delegate   collectionView の 、あなたはすべて設定されています。

あなたの答え