选择器方法不调用

Selector method does not call

我只是 UIViewController class:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var _ = Test(parentView: view)
    }
}

和另一个 class:

import UIKit

class Test: NSObject {

    let parentView: UIView

    init(parentView: UIView) {
        self.parentView = parentView

        super.init()

        addButton()
    }
}

extension Test {

    func addButton() {
        let button = UIButton(type: .custom)
        button.frame.size = CGSize(width: 100, height: 100)
        button.addTarget(self, action: #selector(tap(_:)), for: .touchUpInside)
        button.backgroundColor = UIColor.red
        parentView.addSubview(button)
    }

    func tap(_ sender: UIButton) {
        print("Tap")
    }
}

Test class 继承 NSObject 因为没有它我得到编译器按摩 Argument of '#selector' refers to instance method 'tap(sender:)' that is not exposed to Objective-C.

问题是方法 tap(sender: UIButton) 没有调用。我不知道为什么。

(Swift 3, Xcode 8.2.1, appTarget: iOS 9.0)

编辑 1

我根据@vadian 的建议编辑了 Test class 的实现,但它仍然不起作用。

编辑 2

当我将 Test class 实施移动到 ViewController 时,一切正常,但我不想这样做。为什么这在单独的 class 中不起作用?

我已经测试了您的项目,问题出在这一行 var _ = Test(parentView: view),您正在其中创建自定义对象 class Test。所以在 viewDidLoad 之后它的实例是 loss 或 deinit。这就是您没有收到带有按钮的操作调用的原因。

要解决此问题,请在 ViewController class 中声明一个类型 Test 的实例 属性 并在 viewDidLoad 中初始化此 属性 .现在它会在您点击按钮时调用操作。

class ViewController: UIViewController {

    var test: Test?       

    override func viewDidLoad() {
        super.viewDidLoad()

        self.test = Test(parentView: view)
    }
}