2016-03-25 1 views
1

Comme Swift de 2,2, le code suivant donne l'avertissement:en référence du sélecteur Objective-C d'un procédé

Aucune méthode déclarée avec Objective-C selector'sync »

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

Que dois-je remplacer action: "sync" avec pour se débarrasser de l'avertissement?

J'ai essayé:

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

'#selector (TabBarController.sync)' –

+0

@AaronBrager Merci cela a fonctionné. Donc, ça doit être le nom de la classe? Il semble que '#selector (self.sync)' fonctionne où 'target: self' – doovers

+1

@doovers Oui, vous spécifiez la signature de la méthode (l '" action ") à exécuter sur une instance spécifique (la" cible ") –

Répondre

11

Pour la résolution de votre problème à la première lecture nouveau documentation sur les sélecteurs dans Swift2.2.

Exemple: Utilisez #selector(CLASS.sync) au lieu de Selector("sync"). Où CLASS est la classe réelle qui contient cette méthode.

Et cela a été fait pour cette raison:

L'utilisation de littéraux de chaîne pour les noms de sélection est extrêmement sujette à l'erreur: il n'y a pas vérifier que la chaîne est même un sélecteur bien formé, beaucoup moins que cela se réfère à une méthode connue, ou une méthode de la classe prévue. De plus, avec l'effort de renommer automatiquement les API Objective-C , le lien entre le nom Swift et le sélecteur Objective-C n'est pas évident. En fournissant une syntaxe explicite «créer un sélecteur» basée sur le nom Swift d'une méthode, nous éliminons la nécessité pour les développeurs de raisonner sur les sélecteurs Objective-C utilisés.

+0

Que faire si la méthode "sync" est privée? L'avertissement/erreur ne disparaît pas alors. Toute solution pour cela? – PanxShaz

+0

@PanxShaz vous ne pouvez pas appeler la méthode privée via le sélecteur, car il nous manque tous les points de la fonction privée. –

0

Je pense que vous avez égaré la fonction action "synchronisation". Conservez-le dans votre TabBarController car vous avez utilisé l'instance de TabBarController en tant que cible. Code comme ci-dessous fonctionnera:

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

garder ci-dessous fonction TabBarController:

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

espère qu'il résout votre problème. :)