Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 子类中的Swift#选择器_Ios_Xcode_Swift - Fatal编程技术网

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上不适用于我-相反,它调用超类(即从“基”打印)