【问题标题】:Swift: tap Gesture not recognizedSwift:点击手势无法识别
【发布时间】: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) 不应该有任何参数。所以stackoverflow.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)'

标签: ios swift uigesturerecognizer


【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多