Swift:为nib类终止app UITapGestureRecognizer

时间:2018-06-13 08:05:46

标签: swift xcode nib

我创建了nib类:

import UIKit

class AlertController: UIView {
    @IBOutlet weak var back: UIView!
    @IBOutlet weak var viewMain: UIView!

    class func createAlert() -> AlertController {
        let myNib = UINib(nibName: "Alert", bundle: nil)
        let nib = myNib.instantiate(withOwner: nil, options: nil)[0] as! AlertController

        nib.back.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleBack(sender:))))

        return nib
    }

    @objc func handleBack(sender: UITapGestureRecognizer) {
        //viewMain.isHidden = true
        print("LogIos => X")
    }
}

并在另一个班级上使用它:

let view = AlertController.createAlert()
viewMain.addSubview(view)

这项工作很好,但如果我点击back button我会收到以下错误:

  

2018-06-13 12:28:03.958448 + 0430 Mat [50493:243526] ***终止   应用程序由于未捕获的异常'NSInvalidArgumentException',原因:   '+ [Mat.AlertController handleBackWithSender:]:无法识别的选择器   发送到类0x104db4e90'

但是,如果我使用下面的代码,工作正常:

@IBAction func xxx(_ sender: Any) {
    print("LogIos => Y")
}

我想使用UITapGestureRecognizer,因为我使用View作为自定义按钮

1 个答案:

答案 0 :(得分:2)

虽然我不明白你的意思" func xxx工作正常" (如果使用与上面相同的代码,则不应该这样),问题是:

  • createAlert是一个静态(class)函数
  • 内部
    • 您创建了nib
    • 的实例AlertController
    • 您的#selector引用self,在这种情况下是本身,而不是实例
  • 因此,手势识别器会引用静态(class)函数handleBack - 当您仔细查看异常文本中的+符号时可以看到:

      

    原因:' + [Mat.AlertController handleBackWithSender:]:无法识别的选择器

  • 因此,要么handleBack为静态(class func),要么提供一个实例作为目标(这就是我想要的,正如我所想的那样)

    < / LI>

所以

nib.back.addGestureRecognizer(UITapGestureRecognizer(target: nib, action: #selector(handleBack(sender:))))

应该适合你。

备注

尽管如此,让我给你一个设计提示:虽然你将它命名为AlertController,但它不是一个视图控制器,而是一个UIView - 这很令人困惑。你应该清楚地分开视图和控制器,并分开哪些处理什么。