IOS Swift:单独的 class 文件中的按钮操作

IOS Swift: Button Action in a separate class file

我只需要实现一个自定义 class,它在初始化时引用一个按钮,然后在其中执行操作(Touch Up Inside)。

刚刚尝试了以下方法,但出现异常 'unrecognized selector sent to instance 0x7fbb48615ac0'

import UIKit
class CustomButton
{
    var view: UIViewController
    var btnTest: UIButton!

    init(view: UIViewController, testBtn: UIButton)
    {
        self.view = view
        self.btnTest = testBtn

        // self.btnTest.addTarget(self, action: "btnMethod:", forControlEvents: UIControlEvents.TouchUpInside)
        self.btnTest.addTarget(self, action: Selector("btnMethod:"), forControlEvents: UIControlEvents.TouchUpInside)
    }

    func btnMethod(sender: UIButton)
    {
        println("Click alright.....")
    }
}

完整的异常信息如下

无法真正理解我在这里出错的地方。很高兴听到我做错了什么。提前致谢!!!

编辑

以下是完整的工作解决方案

class CustomButton: NSObject
{
   var view: UIViewController
   var btnTest: UIButton!

   init(view: UIViewController, testBtn: UIButton)
   {
        self.view = view
        self.btnTest = testBtn

        super.init()
        self.btnTest.addTarget(self, action: Selector("btnMethod:"), forControlEvents: UIControlEvents.TouchUpInside)
    }

    deinit
    {
        println("De-Init happens...")
    }

    func btnMethod(sender: UIButton)
    {
        println("Click alright.....")
    }
}

如果您更正确地看到您的错误...由于未捕获的异常而终止应用程序[NSArray I 按钮方法:]。所以您的选择器是错误的..将其更改如下

self.btnTest.addTarget(self, action:"btnMethod:", forControlEvents: UIControlEvents.TouchUpInside)

CustomButton class 中的代码简单明了并且看起来正确。问题是 class 实例(变量)正在被取消初始化,然后点击按钮,它试图在未初始化的变量上调用选择器。

您可以通过添加到自定义按钮来确认这一点 class:

deinit {
   println("deinit")
}

如果您看到 deinit 在您点击按钮之前发生,您就知​​道点击按钮时它会崩溃。

解决方案是确保 UIViewController 中的 CustomButton 变量 (customBtn) 是 class 的 属性 而不是局部变量。这样,只要您的 UIViewController 存在,CustomButton 就会一直存在。

class PaymentViewController: UIViewController {

  var customButton: CustomButton!
  let button: UIButton!

  override func viewDidLoad() {
     super.viewDidLoad()

     // initialize self.button

     // this instance will stick around for the life of the PaymentViewController
     customButton = CustomButton(self, button)
  }

}