我有一个带默认参数的函数:
func myFunc(foo: Bool = true) { }
我正在尝试找出正确的Selector
语法,因为我将其添加为UIRefreshControl
self.refreshControl.addTarget(self, action: Selector("myFunc"), forControlEvents: UIControlEvents.ValueChanged)
我已经尝试了Selector("myFunc")
和Selector("myFunc:")
- 两者都因无效的选择器错误而崩溃。
有网络冲刷,但没有解决方案被抛出。有人可以帮忙吗?感谢
答案 0 :(得分:5)
我们正在尝试向UI元素添加操作。如果我们尝试将控件从接口构建器文件连接到视图控制器类,请考虑Xcode向我们提供的选项:
与您正在使用的方法非常相似,Interface Builder正在向我们询问多项内容。
self.refreshControl
的{{1}}。addTarget
(默认)或AnyObject
选项。如果是UIButton
,则选项为UIRefreshControl
或AnyObject
。这是作为“发件人”对象传递的。UIRefreshControl
方法一样)。最后,Interface builder告诉我们应该传递什么样的参数:
我们在这里有三个选择。
我们不能传递任何参数,在这种情况下,我们有一个看起来像这样的方法:
addTarget
或者我们可以传递“发件人”,在这种情况下,方法将如下所示:
func myFunc() {
}
但func myFunc(sender: AnyObject) {
}
的类型会因我们实际发送的内容而异。
或者我们可以传递发件人和事件类型(如果多个事件与同一方法绑定,则非常有用):
sender
如果通过“界面”构建器完成,我们在开始时也会遇到func myFunc(sender: AnyObject, forEvent event: UIEvent) {
}
,但这不是我们在您的示例中所做的。
现在,如果这是Objective-C,我们的方法将如下所示:
@IBAction
并且Objective-C不支持重载,所以它不允许同一个类中的另一个函数看起来像这样:
- (void)myFunc:(id)sender {
}
你不能有两个同名的方法。
但是,Swift确实支持方法重载,因此,同一个类可以具有以下两种方法:- (void)myFunc:(BOOL)foo {
}
这些是Swift眼中完全不同的方法,非常精细。
但是,您的代码只有后者。一个名为func myFunc(foo: AnyObject) {
}
func myFunc(foo: Bool) {
}
的方法,它接受一个Bool参数。
当您尝试添加myFunc
方法时,Swift正在寻找一个方法,其中包含您提供的名称(addTarget:
),该方法可以接受myFunc:
参数。它无法找到过载。
实际上,您获得的错误与此错误相同:
关键是,Swift找不到一个可以接受UIRefreshControl
参数的myFunc:
方法。
答案 1 :(得分:2)
您遇到了崩溃,因为它需要一个不同的参数。 ' addTarget'期望获得一个函数,谁的唯一参数(如果有的话)是AnyObject(或者可能是UIView),而不是Bool