1

swift3 でのコーディング中に、コレクション ビュー セルを再利用するためにカスタム プロトコルとジェネリックを使用したいと考えました。これがセルを再利用する標準的な方法であることは知っています。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TacoCell", for: indexPath) as? TacoCell {

        cell.configureCell(taco: ds.tacoArray[indexPath.row])

        return cell
    }

    return UICollectionViewCell()
}

しかし、私がこれをやろうとするたびに:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(forIndexPath: indexPath) as TacoCell
    cell.configureCell(taco: ds.tacoArray[indexPath.row])
    return cell
}

コンパイラは、「呼び出しでパラメーター 'for' の引数がありません」と不平を言います...この場合のパラメーターは「forIndexPath」です

ご参考までに...

セルを再利用してニブをロードするためのカスタム拡張機能があります。コードは次のとおりです。

ReusableView クラス

import UIKit

protocol ReusableView: class  { }

extension ReusableView where Self: UIView {

    static var reuseIdentifier: String {
        return String.init(describing: self)
    }
}

NibLoadableView クラス

import UIKit

protocol NibLoadableView: class { }

extension NibLoadableView where Self: UIView {

    static var nibName: String {
        return String.init(describing: self)
    }
}

これは UICollectionView の私の拡張機能です

import UIKit

extension UICollectionView {
    func register<T: UICollectionViewCell>(_: T.Type) where T: ReusableView, T: NibLoadableView {

    let nib = UINib(nibName: T.nibName, bundle: nil)
    register(nib, forCellWithReuseIdentifier: T.reuseIdentifier)
}


func dequeueReusableCell<T: UICollectionViewCell>(forIndexPath indexPath: NSIndexPath) -> T where T: ReusableView {

    guard let cell = dequeueReusableCell(withReuseIdentifier: T.reuseIdentifier, for: indexPath as IndexPath) as? T else {
        fatalError("Could not dequeue cell with identifier: \(T.reuseIdentifier)")
    }

    return cell
    }
}

extension UICollectionViewCell: ReusableView { }
4

1 に答える 1

2

問題は、Swift 3.0 コードの横に Swift 2.2 コードが少しあることです。完全に一致するメソッドがないため、呼び出すメソッドを選択しようとすると、コンパイラが混乱します。

メソッドは、コレクション ビューから独自の拡張メソッドをcellForItemAt呼び出します。ただし、作成した拡張メソッドは を受け取ることを期待していますが、これは微妙に異なります。dequeueReusableCell()IndexPathNSIndexPath

拡張メソッドをこれに修正すると、問題は解決するはずです。

func dequeueReusableCell<T: UICollectionViewCell>(forIndexPath indexPath: IndexPath) -> T where T: ReusableView {
于 2016-09-07T10:16:55.290 に答える