【发布时间】:2016-07-30 11:11:37
【问题描述】:
这里是 Swift 和 iOS 开发的超级新手。
我正在关注 this tutorial 在单视图 iOS 应用程序中实现自定义控件。这是一个 Swift 2 教程,但到目前为止,我可以随时将所有内容转换为 3(我使用 XCode 8 Beta)。
我有一个自定义类RatingControl,连接到情节提要中的View。
在类的构造函数中,我创建了一个按钮:
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
button.backgroundColor = UIColor.red()
然后,我尝试为按钮分配一个动作。教程说我应该这样做:
button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(_:)),
for: .touchDown)
然后在同一个RatingControl 类中创建方法:
func ratingButtonTapped(button: UIButton) {
print("Button pressed ????")
}
但是当我编译时,它会抱怨:
类型“RatingControl”没有成员“ratingButtonTapped”
我已经 100% 确定该函数存在于类中,并且命名正确。 Full source
我有什么明显的遗漏吗?
我尝试了什么:
根据 this answer 将
@objc添加到类定义中(但这对于仅 Swift 的东西来说似乎奇怪,不是吗?)明确地将
ratingButtonTapped()设为public(但这看起来没有必要)摆弄字符串而不是选择器,
button.addTarget(self, action: "RatingControl.ratingButtonTapped", for: .touchDown)等等,但这只会在以后崩溃。
【问题讨论】:
-
啊哈! XCode 的自动提示功能回答了这个问题:我现在需要使用
RatingControl.ratingButtonTapped,不带括号。这工作正常并且现在可以编译。我可以删除这个问题 - 但如果有人想提供更详细的答案以及为什么会发生这种情况,我们也许可以将其作为未来读者遇到相同问题的有用资源? -
我认为这个问题只要标记为
swift3就可以了,因为一旦 Swift 3 成为标准,这可能会引起一些混乱。关于选择器的一个提示:如果方法与调用者在同一范围内,您可以调用self.methodName而不是ClassName.methodName,不过只是一个装饰细节。