iOS独立的scrollView& collectionView委托为单个文件

时间:2015-12-22 16:57:43

标签: ios uiscrollview uicollectionview

我有一个UICollectionView,并希望能够在用户滚动实现scrollView委托方法时执行自定义行为。在处理collectionView时,是否可以使用两个单独的对象作为collectionView委托和scrollView委托?

3 个答案:

答案 0 :(得分:7)

您不能拥有单独的代表。 UICollectionViewUIScrollView的子类,并覆盖其delegate属性以将其类型更改为UICollectionViewDelegateUIScrollViewDelegate的子类型)。因此,您只能将一个委托分配给集合视图,并且可以实现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的子类才能实现此目的。

答案 1 :(得分:0)

如果我理解正确,那么你只需要你的视图控制器来继承UICollectionViewController或UICollectionViewDelegate。然后,您可以访问scrollView委托方法,因为它们由collectionView

继承

答案 2 :(得分:0)

创建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
    }
}