iOS 将 scrollView 和 collectionView 委托(delegate)分离到单独的文件中

标签 ios uiscrollview uicollectionview

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

最佳答案

您不能有单独的代表。 UICollectionViewUIScrollView 的子类,并重写其 delegate 属性以将其类型更改为 UICollectionViewDelegate(这是一个UIScrollViewDelegate 的子类型)。因此,您只能将一个委托(delegate)分配给 Collection View ,它可以实现 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 的子类才能正常工作。

关于iOS 将 scrollView 和 collectionView 委托(delegate)分离到单独的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34420852/

相关文章:

ios - 使用 "ACAccountStore"登录未获得授权时,我该怎么办?

ios - 带有 iOS GLES 的 UIImageView

ios - 在 Interface Builder 中,如何正确调整此图像的大小以使其特定于设备?

ios - 将 View 转换为模态 Controller 的 ScrollView

swift - iOS 9 : Determine size of collection view in portrait and landscape

ios - 使用全宽和动态高度单元重新排序 UICollectionView 时出现 UI 问题

iphone - iOS 模拟器是否使用多核?

ios - 是否可以使用 UIPageControl 来控制 UITableView 的移动?

ios - 使用 NSTimer 或 CADisplayLink 查找 UIView 的移动速度

ios - 为 indexPath 获取 didSelectItemAt 上的值并将其添加到委托(delegate)/协议(protocol)以填充标题单元格