选择器方法不调用

时间:2017-02-10 09:38:34

标签: ios swift3 selector

我只有UIViewController类:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var _ = Test(parentView: view)
    }
}

和另一个班级:

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类会继承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课程的实施,但它仍然不起作用。

编辑2

当我将Test类实现移动到ViewController时,一切正常但我不想这样做。为什么这不适用于单独的课程?

1 个答案:

答案 0 :(得分:3)

我测试了您的项目问题在这一行var _ = Test(parentView: view),您要在其中创建自定义类Test的对象。所以在viewDidLoad之后它的实例就会丢失或者去掉。这就是你没有通过按钮进行动作呼叫的原因。

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

class ViewController: UIViewController {

    var test: Test?       

    override func viewDidLoad() {
        super.viewDidLoad()

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