为啥滑动手势识别器在 swift 中会出错?
Posted
技术标签:
【中文标题】为啥滑动手势识别器在 swift 中会出错?【英文标题】:Why does the swipe gesture recognizer give an error in swift?为什么滑动手势识别器在 swift 中会出错? 【发布时间】:2014-07-01 08:40:24 【问题描述】:我正在尝试使用 swift 将滑动手势识别器添加到集合视图中。每次用户向右或向左滑动时,我都希望重新加载我的收藏视图。但是,当我在模拟器的集合视图中向右或向左滑动时,它会给我一个错误,并且 AppDelegate.swift 类会自动打开。错误说 " libc++abi.dylib: terminating with uncaught exception of type NSException "
我把这部分写到collectionViewController类中的viewDidLoad()中
collectionView.userInteractionEnabled = true
collectionView.delegate = self
var left = UISwipeGestureRecognizer(target: collectionView, action: "swipping:")
left.direction = UISwipeGestureRecognizerDirection.Left
collectionView.addGestureRecognizer(left)
var right = UISwipeGestureRecognizer(target: collectionView, action: "swipping:")
right.direction = UISwipeGestureRecognizerDirection.Right
collectionView.addGestureRecognizer(right)
这是刷屏功能:
func swipping (gesture : UIGestureRecognizer)
if let swipeGesture = gesture as? UISwipeGestureRecognizer
switch swipeGesture.direction
case UISwipeGestureRecognizerDirection.Left:
collectionView.reloadData()
pageControl.currentPage++
case UISwipeGestureRecognizerDirection.Right:
collectionView.reloadData()
pageControl.currentPage--
default:
break
为 CollectionViewController 类和 AppDelegate 类添加了 UIGestureRecognizerDelegate。我该怎么办?
谢谢。
【问题讨论】:
【参考方案1】:当您声明手势识别器时,您将 collectionView 指定为目标:
var left = UISwipeGestureRecognizer(target: collectionView, action: "swipping:")
但我相信 swiping: 方法放在声明发生的同一个文件中。 您必须将目标更改为自己:
var left = UISwipeGestureRecognizer(target: self, action: "swipping:")
var right = UISwipeGestureRecognizer(target: self, action: "swipping:")
//扩展
这不起作用,因为 UICollectionView 是 UIScrollView 的子类,当您滑动 UIScrollView 时会处理手势(这是因为您可以在水平方向创建集合,因此集合视图需要知道您正在向左/向右滚动)。
你应该考虑重写 UIScrollViewDelegate 方法:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
要找出滑动,您应该处理它而不是添加手势识别器。
试试这样的:
//Declare private property
@property (nonatomic, assign) CGFloat prevOffset
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
if (self.prevOffset > scrollView.contentOffset.x)
// You are swiping right
else if (self.prevOffset < scrollView.contentOffset.x)
// You are swiping left
self.prevOffset = scrollView.contentOffset.x;
【讨论】:
你说得对,我改了。现在当我向左或向右滑动时它无法识别。它没有给出错误,但它再次不起作用。 请看扩展答案。 我按照你说的写了scrollViewDidScroll函数。但是,它永远不会被调用。我的意思是当我想在 scrollViewDidScroll 方法中打印一些东西并运行并滚动它时,它没有在控制台上打印任何东西。 只有当您的 UICollectionView 内容大小足够大以允许您滚动时,它才会起作用。如果不是我担心这个解决方案不能帮助你。以上是关于为啥滑动手势识别器在 swift 中会出错?的主要内容,如果未能解决你的问题,请参考以下文章