Swift:终止 nib 类的应用程序 UITapGestureRecognizer

标签 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)

这工作正常,但如果我点击后退按钮,我会得到以下错误:

2018-06-13 12:28:03.958448+0430 Mat[50493:243526] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[Mat.AlertController handleBackWithSender:]: unrecognized selector sent to class 0x104db4e90'

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

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

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

最佳答案

虽然我不明白你所说的“func xxx works fine”是什么意思(如果你使用与上面相同的代码,这不应该),问题是:

  • createAlert 是一个静态(class)函数
  • 内部
    • 您为您的 AlertController 创建一个实例 nib
    • 您的#selector 引用self,在本例中是 本身,而不是实例
  • 因此,手势识别器指的是静态 (class) 函数 handleBack - 当您仔细查看 + 时,您会发现它 登录异常文本:

    reason: '+[Mat.AlertController handleBackWithSender:]: unrecognized selector

  • 因此,要么使 handleBack 成为静态的(class func),要么提供一个实例作为目标(这是您想要的,就像我一样假设)

所以

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

应该适合你。

备注

尽管如此,让我给您一个设计提示:虽然您将其命名为 AlertController,但它不是 View Controller ,而是 UIView - 这令人困惑。您应该清楚地将 View 和 Controller 分开,并将它们中的哪一个处理什么。

关于Swift:终止 nib 类的应用程序 UITapGestureRecognizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50832101/

相关文章:

swift - 通过 UITabBar 启动相机的最佳方式

swift - Swift 中的接口(interface)模拟用于回调实现

ios - Storyboard转场

ios - swift ;来自 UNUserNotificationCenter 的 HTTP 请求不起作用 : The Internet connection appears to be offline

ios - 为什么我不能操作我的 xib 文件中的对象?

iphone - 无法在 bundle 中加载 NIB

cocoa - mouseMoved 事件在鼠标按下时停止

swift - 在 NSTableView 中使用第一列拖动图像

ios - Xcode 中的错误 "Use of undeclared type"不会消失

ios - 如何知道在框架中定义了一些功能?