Swift:点击手势无法识别

Posted

技术标签:

【中文标题】Swift:点击手势无法识别【英文标题】:Swift: tap Gesture not recognized 【发布时间】:2016-07-25 23:56:32 【问题描述】:

当我的代码被分成类时,我无法让我的点击手势工作。我之前将所有这些都包含在一个文件中,并且运行顺利,所以我认为我在以下代码中做错了:

placeContainerView.userInteractionEnabled = true

let showFullPlaceContainerView = UITapGestureRecognizer(target: self, action: Selector(self.showFullPlaceContainerViewFunction(placeContainerView)))
placeContainerView.addGestureRecognizer(showFullPlaceContainerView)

函数showFullContainerViewFunction(placeContainerView)在哪里

func showFullPlaceContainerViewFunction(placeContainerView: PlaceContainerView) 
    placeContainerView.animateExpandContractContainer()   

func animateExpandContractContainer() 
    print("Tap gesture working")
    if self.displayingPlaceLabel == false 
        print(self.displayingPlaceLabel)
        self.displayingPlaceLabel = true

        UIView.animateWithDuration(0.4, delay: 0.0, options: [], animations: 
            self.center.x += 180
            , completion: nil)
     else 
        self.displayingPlaceLabel = false
        UIView.animateWithDuration(0.4, delay: 0.0, options: [], animations: 
            self.center.x -= 180
            , completion: nil)
    


placeContainerView 不知何故无法识别点击,并且在单击时不返回任何打印语句。

有什么想法吗?感谢您的帮助!

【问题讨论】:

我不确定如何,但选择器#selector(className.methodName) 不应该有任何参数。所以***.com/questions/32085396/…有问题 我认为你的选择器是错误的。它应该是 '#selector(Classname.showFullPlaceContainerViewFunction(_:))' 而不是 'Selector(self.showFullPlaceContainerViewFunction(placeContainerView))' @RJE 正如你所说,我已经替换了它并且代码没有给出任何错误,但是当我运行它并尝试点击“placeContainerView”时,我在调用 animateExpandContractContainer 时收到错误 - 线程1:EXC_BAD_ACCESS @impression7vx 你是对的。我更改了选择器以匹配 RJE 所写的内容,以便通过 placeContainerView mm,我刚刚注意到方法参数不是 UIGestureRecognizer。点击手势将通过 UITapGestureRecogninser(我们无法更改此行为)。您必须使用识别器找到您的“PlaceContainerView”或保留全局参考。例如。 'func showFullPlaceContainerViewFunction(recognizer: UITapGestureRecognizer)' 【参考方案1】:

按照您的建议更改选择器语法

let showFullPlaceContainerView = UITapGestureRecognizer(target: self, action: #selector(self.showFullPlaceContainerViewFunction(_:)))
placeContainerView.addGestureRecognizer(showFullPlaceContainerView)

你的方法会是这样的

func showFullPlaceContainerViewFunction(recognizer: UITapGestureRecognizer) 
    let placeContainerView = recognizer.view as! PlaceContainerView
    placeContainerView.animateExpandContractContainer()   

【讨论】:

我不得不使用 RJE 对选择器的建议,但这很有效。 欢迎小伙伴快乐编码:) 谢谢你!你能解释一下我如何将识别器转换为不同的类吗?这个想法从未在我脑海中闪过。 UITapGestureRecognizer 是否只抓取被点击的任何对象? recognizer.view 会给你添加gesture 的视图对象,希望你现在得到它。【参考方案2】:

查看 placeContainerView 及其父视图框架和 userInteractionEnable。

【讨论】:

【参考方案3】:

期望函数的参数在哪里?

placeContainerView.userInteractionEnabled = true
let showFullPlaceContainerView = UITapGestureRecognizer(target: self, action: #selector(YourViewController.yourFunction(_:))
placeContainerView.addGestureRecognizer(showFullPlaceContainerView)

你预期的功能应该是这样的:

func yourFunction(tapGestureRecognizer:UITapGestureRecognizer) 
   // Do something

【讨论】:

以上是关于Swift:点击手势无法识别的主要内容,如果未能解决你的问题,请参考以下文章

使用点击手势识别器时,IOS swift应用程序无法正常工作

Swift:手势识别器无法识别的选择器发送到实例

Swift - 如何将点击手势添加到 UIViews 数组?

在 uiimageview 上无法识别点击手势

无法将点击手势识别器添加到 SwiftUI MKMapView UIViewRepresentable

SWIFT4:如何让两个点击手势识别器一起工作