У меня есть UICollectionView, и я хочу иметь возможность выполнять настраиваемое поведение, когда пользователь прокручивает через реализацию методов делегата scrollView. Возможно ли иметь два отдельных объекта, которые действуют как делегат collectionView и делегат scrollView при работе с collectionView?

4
agandi 22 Дек 2015 в 19:57

3 ответа

Лучший ответ

У вас не может быть отдельных делегатов. UICollectionView является подклассом UIScrollView и переопределяет свое свойство delegate, чтобы изменить его тип на UICollectionViewDelegate (который является подтипом UIScrollViewDelegate). Таким образом, вы можете назначить только одного делегата для представления коллекции, и оно может реализовать любую комбинацию методов UICollectionViewDelegate и UIScrollViewDelegate.

Однако вы можете без труда перенаправить методы UIScrollViewDelegate другому объекту. Вот как это сделать в Swift; это было бы очень похоже на Objective-C (поскольку все это делается с использованием среды выполнения Objective-C):

import UIKit
import ObjectiveC

class ViewController: UICollectionViewController {

    let scrollViewDelegate = MyScrollViewDelegate()

    override func respondsToSelector(aSelector: Selector) -> Bool {
        if protocol_getMethodDescription(UIScrollViewDelegate.self, aSelector, false, true).types != nil || protocol_getMethodDescription(UIScrollViewDelegate.self, aSelector, true, true).types != nil {
            return scrollViewDelegate.respondsToSelector(aSelector)
        } else {
            return super.respondsToSelector(aSelector)
        }
    }

    override func forwardingTargetForSelector(aSelector: Selector) -> AnyObject? {
        if protocol_getMethodDescription(UIScrollViewDelegate.self, aSelector, false, true).types != nil || protocol_getMethodDescription(UIScrollViewDelegate.self, aSelector, true, true).types != nil {
            return scrollViewDelegate
        } else {
            return nil
        }
    }

Обратите внимание, что MyScrollViewDelegate, вероятно, должен быть подклассом NSObject, чтобы это работало.

7
rob mayoff 23 Дек 2015 в 09:38

Создайте подкласс UICollectionViewController и напишите в него делегаты просмотра прокрутки.

class CustomCollectionViewController: UICollectionViewController {

    override func scrollViewDidScroll(_ scrollView: UIScrollView) {

    }
}

В вашем целевом классе

class MyCollectionViewController: CustomCollectionViewController, UICollectionViewDelegateFlowLayout {
    override func numberOfSections(in collectionView: UICollectionView) -> Int {
      return 1
    }


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

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)

      return cell
    }
}
0
Saranjith 28 Фев 2018 в 06:02

Если я правильно вас понял, вам просто нужен ваш контроллер представления для подкласса UICollectionViewController или UICollectionViewDelegate. Затем вы можете получить доступ к методам делегата scrollView, поскольку они унаследованы от collectionView

0
LulzCow 22 Дек 2015 в 17:08