我只有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)
我根据@vadian的建议编辑了Test
课程的实施,但它仍然不起作用。
当我将Test
类实现移动到ViewController
时,一切正常但我不想这样做。为什么这不适用于单独的课程?
答案 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)
}
}