我有一个 UICollectionView 并且希望能够在用户滚动通过实现 scrollView 委托(delegate)方法时执行自定义行为。在使用 collectionView 时,是否可以有两个单独的对象充当 collectionView 委托(delegate)和 scrollView 委托(delegate)?
最佳答案
您不能有单独的代表。 UICollectionView
是 UIScrollView
的子类,并重写其 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/