2017-04-08 1 views
1

Je suis en train de passer UIBarButtonItem comme argument, mais je reçois l'erreur suivante:Comment passer argument à la méthode avec '#selector'

Argument of '#selector' does not refer to an '@objc' method, property, or initializer

@objc func barClicked(sender: AnyObject) { 

} 
override func viewDidLoad() { 
    super.viewDidLoad() 
    let bar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 50)) 
    bar.barStyle = UIBarStyle.default 
    bar.items = [ 
     UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), 
     UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(barClicked(sender: bar.items[0])))] 
    bar.sizeToFit() 
} 

également essayé #selector(barClicked(sender: bar.items[0] as AnyObject

Merci

+3

S'il vous plaît jeter un oeil à la section « connexes », Cela a été demandé et répondu à plusieurs reprises. Vous * ne pouvez pas * passer des arguments dans le sélecteur. –

+1

FYI - Le bouton sera l'argument. Vous n'avez pas besoin de le spécifier vous-même. – rmaddy

+0

@MartinR Merci, existe-t-il une alternative pour résoudre ce problème? –

Répondre

2

Vous n'avez jamais jamais passer des arguments à la méthode à laquelle vous faites référence lorsque vous utilisez le #selector littéral. L'argument (s) sera transmise à la méthode par l'interprète du sélecteur, qui dans ce cas, est le fonctionnement interne de UIBarButtonItem.

Pour résoudre ce problème, il suffit de retirer la liste des arguments:

#selector(barClicked) 

Lorsque le sélecteur est effectuée, le paramètre sender sera très probablement tenir une référence à la deuxième UIBarButtonItem dans la barre d'outils, puisque vous définissez la sélecteur que le action pour le deuxième UIBarButtonItem.

Cependant, t semble être que vous voulez délibérément l'expéditeur d'être le premier UIBarButtonItem de la barre d'outils. Cela semble plutôt contre-intuitif. Vous pourriez faire quelque chose de mal ici. Mais si vous insistez pour passer le premier élément de la barre d'outils, faites ceci:

// add a new method like this: 
func someMethod() { // name this properly! 
    barClicked(sender: bar.items[0]) // please make bar a class-level variable first. 
} 

Ensuite, vous pouvez vous référer à someMethod avec #selector:

#selector(someMethod)