如何将方法订阅到包含此方法的类之外的按钮触摸中?

时间:2019-03-07 11:15:43

标签: ios swift event-handling

我在视图上有一个带有单个按钮的SomeViewController。在didLoad中,我通过以下方式从对象添加方法作为按钮触摸的处理程序:

class SomeViewController: UIViewController {

   func didLoad() {
     // ...
     let x = X()
     button.addTarget(self, action: #selector(x.test), 
                      for: UIControl.Event.touchUpInside)
     // ...
   }

   class X {
     @objc func test(sender:UIButton) {
        // ...       
     }
   }

   @objc func test(sender:UIButton) {
       // ...
   }
}

我是新手,没有使用Objective-C的经验。但是,当我检查名为SomeViewController.test的按钮触摸时,破坏了我对编程语言的理解。对我来说,这似乎是一个错误。 删除SomeViewController.test后,触摸按钮会导致异常:

  

2019-03-07 13:07:25.737090 + 0200 myProgram [13570:283951]   -[myProgram.SomeViewController testWithSender:]:无法识别的选择器已发送到实例0x7fbcc9d174d0 2019-03-07

     

13:07:25.745918 + 0200 myProgram [13570:283951] ***由于以下原因终止了应用   未捕获的异常“ NSInvalidArgumentException”,原因:   '-[myProgram.SomeViewController testWithSender:]:无法识别   选择器发送到实例0x7fbcc9d174d0'

使用包装器#selector订阅事件的原理是什么? 如何将方法订阅到包含此方法的类之外的按钮触摸中?如果不可能,为什么?


迅速4.2

1 个答案:

答案 0 :(得分:1)

替换

button.addTarget(self, action: #selector(x.test), 
                  for: UIControl.Event.touchUpInside)

使用

button.addTarget(x, action: #selector(x.test), 
                  for: UIControl.Event.touchUpInside)

由于目标应包含选择器方法的实现,因此最好制作

let x = X()

实例变量