gpt4 book ai didi

ios - 转发 UIScrollViewDelegate 调用时出现问题

转载 作者:行者123 更新时间:2023-11-30 13:22:01 28 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。我有一个自定义组件来为我处理 UICollectionView 的布局。该代码是用 Swift 编写的。

class MyCustomCollectionViewHandler: NSObject {

let collectionView: UICollectionView
weak var dataSource: UICollectionViewDataSource?
weak var delegate: UICollectionViewDelegate?

init(collectionView: UICollectionView) {
self.collectionView = collectionView
super.init()
self.collectionView.delegate = self
self.collectionView.dataSource = self
}

// Rest of the code not relevant here
}

extension MyCustomCollectionViewHandler: UICollectionViewDataSource, UICollectionViewDelegate {

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
//
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
//
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
//
}

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
//
}
}

但是,我不想处理来自 MyCustomCollectionViewHandler 部分的所有其他委托(delegate)回调(尤其是 UIScrollViewDelegate 部分)。所以我想如果可能的话我会手动转发所有委托(delegate)调用,我用该代码来做到这一点:

extension MyCustomCollectionViewHandler {

// forwarding selector if we don't implement it
override func forwardingTargetForSelector(aSelector: Selector) -> AnyObject? {
if delegate?.respondsToSelector(aSelector) ?? false {
return delegate
}
if dataSource?.respondsToSelector(aSelector) ?? false {
return dataSource
}
return super.forwardingTargetForSelector(aSelector)
}

override func respondsToSelector(aSelector: Selector) -> Bool {
return super.respondsToSelector(aSelector) || delegate?.respondsToSelector(aSelector) ?? false || dataSource?.respondsToSelector(aSelector) ?? false
}
}

我从 Objective-C 类初始化我的 MyCustomCollectionViewHandler :

- (void)initCollectionStructure
{
self.collectionViewHandler = [[MyCustomCollectionViewHandler alloc] initWithCollectionView:self.collectionView];
//-- So all the other calls fallback here
self.collectionViewHandler.delegate = self;
}

我还在这里实现了 UIScrollViewDelegate 调用,如下所示:

- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return nil;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{

}

最后,我的问题是:我的 scrollViewDidScroll 从未被调用,而 viewForZoomingInScrollView 则被调用。

如果我在 MyCustomCollectionViewHandler 上实现 scrollViewDidScroll,则会调用它。

但我希望在 ObjC 部分调用它。

有人可以看看我是否做错了什么吗?谢谢;-)

最佳答案

我认为方法override func respondsToSelector(aSelector: Selector) -> Bool可能有问题。如果您不希望处理程序响应委托(delegate)方法,您应该retrun false?像:

override func respondsToSelector(aSelector: Selector) -> Bool {
if delegate?.respondsToSelector(aSelector) ?? false {
return false
}
if datasource?.respondsToSelector(aSelector) ?? false {
return false
}
return super.respondsToSelector(aSelector)
}

关于ios - 转发 UIScrollViewDelegate 调用时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37674768/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com