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

Posted

技术标签:

【中文标题】我无法将 handlePan: 发送到我的 UIScrollView?【英文标题】:I can't send handlePan: to my UIScrollView? 【发布时间】:2014-03-18 17:42:23 【问题描述】:

我试图做一些我认为现在很简单的事情。但它会产生一个错误,从而引发几个问题。

首先,我尝试在UICollectionView 中进行拖动操作。但我仍然希望该视图可以滚动。我还没有找到任何(还没有?)可以直接解决此问题的方法。

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

所以我想...我会获取那个手势识别器,并插入一个垫片,这样我就有机会首先处理平移手势。如果它满足我的阻力要求,我会处理它,否则,我会让它走正常路线。为了实现这一点,我将此代码添加到我的 viewDidLoadUICollectionViewController 子类中:

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 
    

这很好用(我已经用捏识别器完成了这个)。但是当我实现我的 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 上的拖动并仍然保持滚动(但是,即使我做错了,我仍然想了解错误)。

【问题讨论】:

你是否转储了 pan 识别器的原始目标,我猜它不是 UICollectionView。 在擦除原始目标之前在其上打了一个NSLog2014-03-18 11:50:07.832 myValve[1107:60b] defaul pan gesture: <UIScrollViewPanGestureRecognizer: 0x17d90660; state = Possible; delaysTouchesEnded = NO; view = <UICollectionView 0x1837f200>; target= <(action=handlePan:, target=<UICollectionView 0x1837f200>)>> 【参考方案1】:

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

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

【讨论】:

以上是关于我无法将 handlePan: 发送到我的 UIScrollView?的主要内容,如果未能解决你的问题,请参考以下文章

我如何通过 json 将数据从我的设备发送到我的 php 文件

为啥我的提交按钮不能将信息发送到我想要的电子邮件? (PHP)

如何覆盖 UICollectionView 中的 handlePan 选择器

尝试制作一个屏幕截图按钮,当单击按钮时将屏幕截图发送到我的相机胶卷。斯威夫特 3,Xcode 8,IOS

为啥我的 php 没有将我的联系表单输入发送到我的电子邮件?

无法重新发送 ION