Ios 子类中的Swift#选择器
在我更新了Ios 子类中的Swift#选择器,ios,xcode,swift,Ios,Xcode,Swift,在我更新了XCode,以便它现在可以为ios9.3构建代码之后,我收到了很多关于更新语法以符合即将发布的Swift版本3的警告 很多警告都是关于选择器的,现在我使用的是这样的东西: class Foo { func registerPan() { let recognizer = UIPanGestureRecognizer(target: self, action: Selector("handlePan:")) //do something with
XCode
,以便它现在可以为ios9.3
构建代码之后,我收到了很多关于更新语法以符合即将发布的Swift版本3
的警告
很多警告都是关于选择器的
,现在我使用的是这样的东西:
class Foo {
func registerPan() {
let recognizer = UIPanGestureRecognizer(target: self, action: Selector("handlePan:"))
//do something with recognizer
}
func handlePan(recognizer:UIPanGestureRecognizer) {
//handle pan gesture
}
}
class Bar: Foo {
override func handlePan(recognizer:UIPanGestureRecognizer) {
//overriding handle pan gesture
}
}
因此,Foo
和Bar
的实例有自己处理平移手势的方法Xcode
建议我更改使用选择器的方法,使用#选择器表达式
。编辑器建议的自动更改为:
#selector(Foo.handlePan(_:))
我的问题来了。在以前的版本中,为基类和子类调用了特定的实现。现在,看起来即使是对于Bar
类的实例,Foo
的函数也将被调用(Bar
从Foo
继承registerPan
函数)。这是正确的吗
在这里,静态分析可能不关心继承。我正在考虑将这些选择器更改为:
#selector(self.handlePan(_:))
因此,任何类的实例都调用自己的实现,但我想确定这是否是一个好主意。正如苹果文档所说:
选择器表达式允许您访问用于引用的选择器
方法在Objective-C中
方法名称必须是对中可用的方法的引用
Objective-C运行时。选择器表达式的值是
选择器类型的实例。例如:
..因为选择器是在编译时而不是在运行时创建的
编译器可以检查该方法是否存在以及该方法是否正确
暴露于Objective-C运行时
您还可以在vc中扩展选择器,并在那里声明您的选择器:
private extension Selector {
static let updateItems = #selector(CharactersListVC.updateItems)
static let getMoreItems = #selector(CharactersListVC.getMoreItems)
}
然后就这样使用它:
button?.addTarget(self, action: .updateItems, forControlEvents: .TouchUpInside)
希望它能有所帮助:)正如苹果的文档所说:
选择器表达式允许您访问用于引用的选择器
方法在Objective-C中
方法名称必须是对中可用的方法的引用
Objective-C运行时。选择器表达式的值是
选择器类型的实例。例如:
..因为选择器是在编译时而不是在运行时创建的
编译器可以检查该方法是否存在以及该方法是否正确
暴露于Objective-C运行时
您还可以在vc中扩展选择器,并在那里声明您的选择器:
private extension Selector {
static let updateItems = #selector(CharactersListVC.updateItems)
static let getMoreItems = #selector(CharactersListVC.getMoreItems)
}
然后就这样使用它:
button?.addTarget(self, action: .updateItems, forControlEvents: .TouchUpInside)
希望它有帮助:)@pkacprzak你是对的,只是测试了一下 选择器(self.handlePan(:)工作正常 //这是密码
class Foo:UIView {
override init(frame: CGRect) {
super.init(frame: frame)
registerPan()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func registerPan() {
let recognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(_:)))
//do something with recognizer
self.addGestureRecognizer(recognizer)
}
@objc func handlePan(recognizer:UIPanGestureRecognizer) {
//handle pan gesture
print("From Base")
}
}
class Bar: Foo {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func handlePan(recognizer:UIPanGestureRecognizer) {
//overriding handle pan gesture
print("From Child")
}
}
这就是它的名字
override func viewDidLoad() {
super.viewDidLoad()
let bar = Bar(frame: self.view.frame)
self.view.addSubview(bar)
}
@pkacprzak你是对的,刚刚测试过这个 选择器(self.handlePan(:)工作正常 //这是密码
class Foo:UIView {
override init(frame: CGRect) {
super.init(frame: frame)
registerPan()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func registerPan() {
let recognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(_:)))
//do something with recognizer
self.addGestureRecognizer(recognizer)
}
@objc func handlePan(recognizer:UIPanGestureRecognizer) {
//handle pan gesture
print("From Base")
}
}
class Bar: Foo {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func handlePan(recognizer:UIPanGestureRecognizer) {
//overriding handle pan gesture
print("From Child")
}
}
这就是它的名字
override func viewDidLoad() {
super.viewDidLoad()
let bar = Bar(frame: self.view.frame)
self.view.addSubview(bar)
}
你试过了吗?我当然试过了。我在问在这种情况下应该做什么。你试过了吗?我当然试过了。我在问在这种情况下应该做什么。是的,它产生“来自孩子”。在iOS 10、Xcode 8、Swift 3上不为我工作-相反,它调用超类(即打印“来自基地”),是的,它产生“来自孩子”.在iOS 10、Xcode 8、Swift 3上不适用于我-相反,它调用超类(即从“基”打印)