不知道为什么当我尝试使用我在代码中创建的按钮时收到“无法识别的选择器发送到类”错误。
这是我的代码:
let sendButton: UIButton = {
let button = UIButton(type: .system)
button.setTitle("Send", for: .normal)
button.setTitleColor(UIColor.white, for: .normal)
button.backgroundColor = #colorLiteral(red: 0.5098039216, green: 0.5215686275, blue: 0.8392156863, alpha: 1)
button.layer.cornerRadius = 5
button.isUserInteractionEnabled = true
button.addTarget(self, action: #selector(postComment), for: .touchUpInside)
return button
}()
这实际上只是时间问题。您正在声明一个实例属性以及一个初始化该属性的定义和调用函数,然后您继续说button.addTarget(self...
在那个函数中。那么问题是:该函数的代码何时运行?令人难以置信的是,这非常重要,以至于它实际上改变了self
.
当你说let
为了做出此声明,代码在实例尚不存在时运行。这个实例正是我们在那一刻正在形成的过程中;它还没有“煮熟”。事实上,在你不知道的情况下,self
那一刻的意思是UIButton 类!因此产生的目标动作是无效的;你没有类方法postComment
;它是一个实例方法(正确的)。稍后,当您点击按钮时,我们会尝试说postComment
到了班级,我们崩溃了。 “无法识别的选择器发送到班级”,正如你所说。
另一方面,当你说lazy var
,直到实例之后才会调用代码self
确实存在,self
意味着实例,一切都很好。
对于初学者和不太初学者来说,这非常令人困惑。即使在指出问题之后,我自己也犯了完全相同的错误。在我看来,编译器应该捕获这个并阻止你,但它没有。我已经提交了一个错误:http://bugs.swift.org/browse/SR-4865
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)