我无法将 handlePan: 发送到我的 UIScrollView?
Posted
技术标签:
【中文标题】我无法将 handlePan: 发送到我的 UIScrollView?【英文标题】:I can't send handlePan: to my UIScrollView? 【发布时间】:2014-03-18 17:42:23 【问题描述】:我试图做一些我认为现在很简单的事情。但它会产生一个错误,从而引发几个问题。
首先,我尝试在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
这很好用(我已经用捏识别器完成了这个)。但是当我实现我的 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。 在擦除原始目标之前在其上打了一个NSLog
:2014-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