我不确定为什么我会将#34;无法识别的选择器发送到班级"我尝试使用我在代码中创建的按钮时出错。
这是我的代码:
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
}()
答案 0 :(得分:6)
实际上这完全是时间问题。您正在声明一个实例属性以及初始化该属性的define-and-call函数,然后您继续在该函数中说rowSums(t(apply(df, 1, FUN = function(x) sort(x, decreasing = TRUE)))[ , c(1,2,3)])
。那么问题是:该函数的代码何时运行?令人难以置信的是,这非常重要,以至于它实际上改变了button.addTarget(self...
的含义。
当您说self
进行此声明时,代码将在实例尚不存在时运行。这个例子正是我们在那个时刻形成的过程;它不是煮熟的"然而。事实上,在你不知道的情况下,let
在那一刻意味着 UIButton类!因此产生的目标动作无效;你没有班级方法self
;它是一种实例方法(正确)。因此,稍后当您点按按钮并尝试向课程说postComment
时,我们会崩溃。 "无法识别的选择器发送到班级",正如您所说。
另一方面,当你说postComment
时,直到实例lazy var
存在之后才会调用代码,self
表示实例,一切都很好。
这对初学者和不那么初学者来说非常困惑;即使在指出问题之后,我也开始自己犯同样的错误。在我看来,编译器应该抓住这个并阻止你,但它并没有。我已经提交了一个错误:http://bugs.swift.org/browse/SR-4865
答案 1 :(得分:0)
我其实只是想通了。
出于某种原因,替换“让”'与' lazy var'似乎可以做到这一点。我不能解释它为什么会起作用,但确实如此。