【问题标题】:iOS separate scrollView & collectionView delegates into individual filesiOS 将 scrollView 和 collectionView 委托分离到单独的文件中
【发布时间】:2016-03-29 00:19:13
【问题描述】:

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

【问题讨论】:

    标签: ios uiscrollview uicollectionview


    【解决方案1】:

    您不能有单独的代表。 UICollectionViewUIScrollView 的子类,并覆盖其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 的子类才能正常工作。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2017-03-14
          • 2022-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-04
          • 2016-02-29
          • 1970-01-01
          相关资源
          最近更新 更多