2016-03-25 10 views
1

Ab Swift 2.2, gibt der folgende Code die Warnung:die Objective-C-Selektor eines Verfahrens Referenzierung

Keine Methode deklariert mit Objective-C selector'sync‘

if let tabBarController = segue.destinationViewController as? TabBarController { 
    tabBarController.navigationItem.rightBarButtonItem = 
    UIBarButtonItem(title: "Upload", 
        style: .Plain, 
        target: tabBarController, 
        action: "sync") 

Was soll ich ersetzen action: "sync" es mit der Warnung loswerden?

Ich habe versucht:

Selector("sync") // The Xcode provided fix which yields the same warning 
#selector(tabBarController.sync()) // Error: Argument of '#selector' does not refer to initializer or method 
Selector(tabBarController.sync()) // No error/warning but doesn't fire sync function 
+3

'#selektor (TabBarController.sync)' –

+0

@AaronBrager Danke, es hat funktioniert. Also muss es der Klassenname sein? Es scheint '#selector (self.sync)' funktioniert wo 'target: self' – doovers

+1

@doovers Ja, Sie geben die Methodensignatur (die" Aktion ") an, die für eine bestimmte Instanz ausgeführt werden soll (das" Ziel ") –

Antwort

11

Zur Lösung Ihres Problems lesen Sie zuerst neue documentation über Selektoren in Swift2.2.

Beispiel: Verwenden Sie #selector(CLASS.sync) anstelle von Selector("sync"). Wo CLASS ist es tatsächliche Klasse, die diese Methode enthält.

Und dies geschehen war aus diesem Grund:

Die Verwendung von Zeichenketten für Selektornamen ist extrem fehleranfällig: Es gibt keine Überprüfung, dass die Zeichenfolge ist auch ein wohlgeformten Selektor, viel weniger, dass es sich auf irgendeine bekannte Methode bezieht, oder eine Methode der beabsichtigten Klasse. Darüber hinaus, mit dem Aufwand, automatische Umbenennung von Objective-C APIs durchzuführen, ist die Verbindung zwischen Swift Name und Objective-C Selektor nicht offensichtlich. Durch explizite "create a selector" -Syntax basierend auf dem Swift-Namen einer Methode eliminieren wir die Notwendigkeit für Entwickler, über die tatsächlichen Objective-C Selektoren zu sprechen.

+0

Was ist, wenn die Methode "Sync" privat ist? Die Warnung/der Fehler verschwindet dann nicht. Irgendeine Lösung dafür? – PanxShaz

+0

@PanxShaz Sie können private Methode nicht über Selektor aufrufen, weil wir alle Punkte der privaten Funktion vermissen. –

0

Ich denke, die Aktion Funktion "sync" verlegt haben. Bewahren Sie es in Ihrem TabBarController auf, da Sie die Instanz von TabBarController als Ziel verwendet haben. Code wie unten funktioniert:

tabBarController.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Upload", style: .Plain, target: tabBarController, action: "sync:") 

halten unterhalb der Funktion in TabBarController:

func sync(sender: AnyObject){ 
    //your code here 
} 

Hoffe, dass es das Problem löst. :)

Verwandte Themen