【发布时间】:2016-03-29 00:19:13
【问题描述】:
我有一个 UICollectionView 并且希望能够在用户滚动通过实现 scrollView 委托方法时执行自定义行为。在使用 collectionView 时,是否可以有两个单独的对象充当 collectionView 委托和 scrollView 委托?
【问题讨论】:
标签: ios uiscrollview uicollectionview
我有一个 UICollectionView 并且希望能够在用户滚动通过实现 scrollView 委托方法时执行自定义行为。在使用 collectionView 时,是否可以有两个单独的对象充当 collectionView 委托和 scrollView 委托?
【问题讨论】:
标签: ios uiscrollview uicollectionview
您不能有单独的代表。 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 的子类才能正常工作。
【讨论】:
如果我理解正确,那么您只需要将视图控制器继承为 UICollectionViewController 或 UICollectionViewDelegate。然后您可以访问 scrollView 委托方法,因为它们是由 collectionView 继承的
【讨论】:
创建 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
}
}
【讨论】: