将传递给方法的选择器指定为按钮目标操作

时间:2018-01-29 06:03:44

标签: ios swift unrecognized-selector

所以这是我的情景。我正在举杯祝酒。 toast视图接受一个选择器,它将其设置为toast视图内按钮的目标操作。但是我得到了无法识别的选择器错误。

 // MainViewController.swift

 func viewDidLoad() {

     // Custom initializer for toastview
     let toastView = ToastView(view: nil, selector: #selector(testSelector))
     .
     .
     .
 }

 @objc func testSelector() {
      print("Test")
 }

 // ToastView.swift

 var selector: Selector

 convenience init(view: UIView, selector: Selector) {
      self.selector = selector
      let button = UIButton(type: .system)
      button.addTarget(self, action: self.selector, for: .touchUpInside)
 }

编辑:稍微更改了代码以反映原始代码中的实际内容。

3 个答案:

答案 0 :(得分:2)

你的目标错了。 Target必须是类的对象,其中定义了选择器(方法或函数)。如果在$studPerInfo = explode(',', $_GET['studRegInfo']); 目标中定义了函数,则必须是MainViewController的对象。如果MainViewController选择器中定义的函数必须是ToastView的对象,则相同。

您可以在ToastView课程中移动testSelector功能并保持休息状态。

选项1

ToastView

选项2

或者您将目标作为// something like this class ToastView { @objc func testSelector() { print("Test") } } 参数传递。

init

并在// ToastView.swift convenience init(view: UIView, target:Any, selector: Selector) { let button = UIButton(type: .system) button.addTarget(target, action: selector, for: .touchUpInside) } 中称之为。

MainViewController

答案 1 :(得分:1)

如果要在testSelector课程中执行操作,则应将ToastView移至ToastView课程。

如果要在MainViewController中执行操作,请使用自定义委托。

或在button类中全局声明ToastView变量。然后,您可以使用

MainViewController中添加目标
let toastView = ToastView()
toastView.button.addTarget(target, action: selector, for: .touchUpInside)

您可以使用闭包来执行按钮操作而不是选择器

class ToastView: UIView {
    let button = UIButton()
    var btnAction:((Void) -> Void)?

    convenience init(_ btnAction: @escaping (Void) -> Void) {
        self.init()
        self.btnAction = btnAction
    }

    private init() {
        super.init(frame: .zero)
        button.addTarget(self, action: #selector(callbackButton(_:)), for: .touchUpInside)
    }

    func callbackButton(_ id:Any) -> Void {
        if self.btnAction != nil {
            self.btnAction!()
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

在MainViewController.swift中

func viewDidLoad() {

     // Custom initializer for toastview
     let toastView = ToastView.init( {(Void) -> Void in
        print("test")
    })
 }

答案 2 :(得分:-1)

不要传入选择器,而是根本不需要传递选择器。 按下按钮时触发通知,并向Controller发送通知观察者。在随观察者附加的选择器中执行您想要的任何操作