web-dev-qa-db-fra.com

Swift contrôle d'accès avec sélecteurs cibles

Jetez un œil à cet exemple de code:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let letterButton = UIButton.buttonWithType(.Custom) as UIButton
        self.view.addSubview(letterButton)
        letterButton.addTarget(self, action:Selector("buttonDidTap:"), forControlEvents: .TouchUpInside)

    }

    func buttonDidTap(button: UIButton!) {
        print(button.char)
    }

}

L'action cible pour UIButton fonctionne correctement tant que le sélecteur est public ou internal, mais si c'est private, il se bloque en raison de sélecteur non reconnu envoyé à l'instance

Existe-t-il un moyen pour y parvenir? Je ne veux pas rendre la fonction tap publique ou interne.

43
Chamira Fernando

vous avez besoin @objc pour exposer une méthode privée au runtime objc

@objc private func buttonDidTap(button:UIButton!) {
    println(button.char)
}

De Notes de version Xcode6 beta4

Les déclarations marquées comme privées ne sont pas exposées au runtime Objective-C si elles ne sont pas annotées autrement. Les points de vente IB, les actions IB et les propriétés gérées Core Data restent exposés à Objective-C quel que soit leur niveau d'accès. Si vous avez besoin d'une méthode ou d'une propriété privée pouvant être appelée à partir d'Objective-C (comme pour une ancienne API qui utilise un rappel basé sur un sélecteur), ajoutez explicitement l'attribut @objc à la déclaration.! !

98
Bryan Chen