UIScrollView Delegate как реализация протокола по умолчанию - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь реализовать реализацию по умолчанию для метода UIScrollViewDelegate:

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)

, используя protocol.

Если я поместил этот метод внутрикласс, это называется;однако, если я попытаюсь использовать в качестве реализации по умолчанию через protocol, он никогда не будет вызван.

Код:

protocol DefaultScrollViewEndDragging {
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
}

extension DefaultScrollViewEndDragging {
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        print("scrollViewWillEndDragging is called")
        // THIS IS NEVER CALLED
    }
}

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, DefaultScrollViewEndDragging {

    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView.dataSource = self
        collectionView.delegate = self
        collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 5
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)
        print("Cell \(indexPath.row)")
        cell.contentView.backgroundColor = .orange
        return cell
    }
}

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Я думаю, вы ищете что-то вроде этого

protocol DefaultScrollViewEndDragging : UIScrollViewDelegate {
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
}

extension DefaultScrollViewEndDragging {
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        print("scrollViewWillEndDragging is called")
        // THIS IS NEVER CALLED
    }
}

К сожалению, расширения протокола недоступны для Obj-C. так что это не называется scrollViewWillEndDragging

Из заметки

Опять же, единственным исключением является расширение протокола. В отличие от любого другие конструкции в языке, методы расширения протокола отправляется статически в ситуации, когда виртуальная отправка вызывают разные результаты. Нет ошибки компилятора предотвращает это несоответствие. https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/001707.html

0 голосов
/ 18 апреля 2019

Правильный код

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UIScrollViewDelegate {

@IBOutlet weak var collectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.dataSource = self
    collectionView.delegate = self
    collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 5
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)
    print("Cell \(indexPath.row)")
    cell.contentView.backgroundColor = .orange
    return cell
}
//MARK: scrollview Delegate Method
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    print("scrollViewWillEndDragging is called")
}

}

...