我无法发送handlePan:到我的UIScrollView?

时间:2014-03-18 17:42:23

标签: ios objective-c ios7 uiscrollview

我试着做一些我认为刚才会直截了当的事情。但它产生了一个错误,导致了一些问题。

首先,我正在尝试在UICollectionView中执行拖动操作。但我仍然希望该视图可滚动。我没有找到任何东西(但是?)这是一个直截了当的解决方案。

我发现在viewDidLoad时,我的UICollectionView已经有一个UIPanGestureRecognizer目标操作设置为视图和选择器handlePan:

所以我想......我会拿起那个手势识别器,插入一个垫片,这样我就有机会先处理手势。如果它满足我的阻力要求,我会处理它,否则,我会让它采取它的常规课程。为此,我将此代码添加到viewDidLoad子类中的UICollectionViewController

for (UIGestureRecognizer *gesture in self.collectionView.gestureRecognizers) {
    if ([gesture isKindOfClass: [UIPanGestureRecognizer class]]) {
        [gesture removeTarget: nil action:nil]; // clear out the default handlePan: target
        [gesture addTarget: self action: @selector(drag:)]; // replace it with my own shim 
    }
}

哪个工作正常(我用夹点识别器完成了这个)。但是当我实现我的垫片方法时:

- (IBAction)drag:(id)sender {
    NSLog(@"drag %@", sender);
    [self.collectionView handlePan: sender];
}

Xcode发出错误:

No visible @interface for 'UICollectionView' declares the selector 'handlePan:'

这让我很困惑。我知道该方法没有出现在UIScrollView的文档化界面中,但我可以看到那是它所针对的选择器。我可能期望一个警告,但不是错误,我认为Objective-C方法调度是运行时和动态的。怎么会克服这个?

切线,我很好奇是否有更好/惯用/规范的方法来实现UIScrollView上的拖动并仍然保持滚动(但是,即使我做错了,我仍然想要理解错误)。

1 个答案:

答案 0 :(得分:1)

误读原始问题,因为Xcode在编译时抱怨未知选择器,你可以将目标转换为id来绕过警告。我仍然不确定我是否会这样做,或者确定Apple不会因使用私有API而反弹它,但这里是:

[(id)self.collectionView handlePan: sender];