我有一个UICollectionView,并希望能够在用户滚动实现scrollView委托方法时执行自定义行为。在处理collectionView时,是否可以使用两个单独的对象作为collectionView委托和scrollView委托?
答案 0 :(得分:7)
您不能拥有单独的代表。 UICollectionView
是UIScrollView
的子类,并覆盖其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
的子类才能实现此目的。
答案 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
}
}