2016-04-19 14 views
1

Nachdem ich aktualisiert XCode, so dass es Code für iOS 9.3 jetzt bauen kann, habe ich eine Menge Warnungen über die Aktualisierung der Syntax zu kommenden Swift version 3 entsprechen.Swift #selector in der Unterklasse

Viele Warnungen sind über Selector, jetzt so etwas wie dieses Ich verwende:

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 
    } 
} 

So Instanzen Foo und Bar ihre eigenen Wege haben pan Geste zu behandeln. Xcode schlägt mir vor, die Methode zu ändern, die ich Selektoren verwende, um #selector expression zu verwenden. Die vorgeschlagene automatische Änderung durch den Editor lautet:

#selector(Foo.handlePan(_:)) 

Hier kommt meine Frage. In der vorherigen Version wurde eine spezifische Implementierung für die Basisklasse und für die Unterklasse aufgerufen. Nun sieht es aus wie Funktion von Foo wird auch für eine Instanz der Bar Klasse aufgerufen (Bar erbt registerPan Funktion von Foo). Ist das richtig?

Wahrscheinlich XCode statische Analyse kümmert sich nicht um Vererbung hier. Ich betrachte diese Selektoren Wechsel zu:

#selector(self.handlePan(_:)) 

so eine Instanz, was auch immer Klasse eine eigene Implementierung ruft, aber ich will sicher sein, ob es eine gute Idee ist.

+0

Nun haben Sie es versucht? – LinusGeffarth

+0

Natürlich tat ich es. Ich frage, was in diesem Fall getan werden sollte. – pkacprzak

Antwort

0

Als Apple-docs sagen:

Ein Wähler Ausdruck können Sie die Auswahl Zugriff verwendet, um eine Methode in Objective-C zu beziehen.

#selector(method name) 

Der Methodenname muss ein Verweis auf ein Verfahren sein, das in die Objective-C Laufzeit zur Verfügung steht. Der Wert eines Selektorausdrucks ist eine Instanz des Selector-Typs. Zum Beispiel:

class SomeClass: NSObject { 
    @objc(doSomethingWithInt:) 
    func doSomething(x: Int) { } 
} 
let x = SomeClass() 
let selector = #selector(x.doSomething(_:)) 

..Because des Wähler bei der Kompilierung erstellt wird, nicht zur Laufzeit können die Compiler prüfen, ob die Methode existiert, und dass das Verfahren auf das Objective-C ausgesetzt Laufzeit.

Sie können auch eine Erweiterung der Wahl in Ihrem vc ('s) und Sie Selektoren erklären es:

private extension Selector { 
    static let updateItems = #selector(CharactersListVC.updateItems) 
    static let getMoreItems = #selector(CharactersListVC.getMoreItems) 
} 

Und dann ist es nur auf diese Weise verwenden:

button?.addTarget(self, action: .updateItems, forControlEvents: .TouchUpInside) 

Hoffnung es hilft :)

0

@pkacprzak Sie sind richtig, nur dies getestet.

Selektor (self.handlePan (_ :) funktioniert

// Hier wird der Code

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") 
} 
} 

hier ist, wie es genannt wird ...

override func viewDidLoad() { 
    super.viewDidLoad() 
    let bar = Bar(frame: self.view.frame) 
    self.view.addSubview(bar) 
} 
+0

Was produziert der Code? "Vom Kind"? – pkacprzak

+0

Ja, es produziert "From Child". –

+1

Funktioniert nicht für iOS 10, Xcode 8, Swift 3 - Stattdessen ruft es die Superklasse auf (dh druckt "Von der Basis") – MobileMon

Verwandte Themen