You cannot have individual delegates. UICollectionViewis a subclass UIScrollViewand overrides its property delegateto change its type to UICollectionViewDelegate(which is a subtype UIScrollViewDelegate). That way, you can only assign one delegate to represent the collection, and it can implement any combination of UICollectionViewDelegateand methods UIScrollViewDelegate.
However, you can redirect methods UIScrollViewDelegateto another object without much difficulty. Here's how you do it in Swift; it will be very similar to Objective-C (since all this is done using the Objective-C runtime):
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
}
}
Note that MyScrollViewDelegateit should probably be a subclass NSObjectfor this.
source
share