为啥滑动手势识别器在 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 中会出错?的主要内容,如果未能解决你的问题,请参考以下文章

添加手势识别器以允许在 Swift 中的 MapView 上水平滑动

在 Xcode 8.0 Swift 3.0 上检测手势

将向上滑动手势识别器添加到模态视图

识别视图中的滑动手势而不是子视图

Swift:向上滑动时出错

Xamarin.Forms 第23局:手势识别