web-dev-qa-db-fra.com

L'utilisation du littéral chaîne pour les sélecteurs Objective-C est obsolète, utilisez '#selector' à la place

J'ai le code suivant:

func setupShortcutItems(launchOptions: [NSObject: AnyObject]?) -> Bool {
    var shouldPerformAdditionalDelegateHandling: Bool = false

    if (UIApplicationShortcutItem.respondsToSelector("new")) {
        self.configDynamicShortcutItems()

        // If a shortcut was launched, display its information and take the appropriate action
        if let shortcutItem: UIApplicationShortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem {
            // When the app launched at the first time, this block can not called.
            self.handleShortCutItem(shortcutItem)

            // This will block "performActionForShortcutItem:completionHandler" from being called.
            shouldPerformAdditionalDelegateHandling = false
        } else {
            // normal app launch process without quick action
            self.launchWithoutQuickAction()
        }
    } else {
        // Less than iOS9 or later
        self.launchWithoutQuickAction()
    }

    return shouldPerformAdditionalDelegateHandling
}

Je reçois l'avertissement suivant sur UIApplicationShortcutItem.respondsToSelector("new"), qui dit:

L'utilisation du littéral chaîne pour les sélecteurs Objective-c est obsolète, utilisez '#selector' à la place

L'avertissement remplace automatiquement le code par:

UIApplicationShortcutItem.respondsToSelector(#selector(FBSDKAccessToken.new))

Cependant, cela ne compile pas car new() n'est pas disponible. Qu'est-ce que je suis supposé utiliser dans ce cas?

12
fuzz

Xcode 7.3 utilisant Swift pour iOS9.3/watchOS2.2/...

Si vous avez déjà utilisé cette ligne de code:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateResult:", name: "updateResult", object: nil)

vous devriez maintenant utiliser cette ligne de code:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(InterfaceController.updateResult(_:)), name: "updateResult", object: nil)

du moins, c’est ce que Xcode m’a offert après avoir modifié quelques caractères du code. On dirait que cela n'offre pas toujours la solution correcte lorsque cette erreur vous est présentée.

16
Florian Uhlemann

Créez un protocole dont la seule raison d'exister est de vous permettre de construire le sélecteur approprié. Dans ce cas:

@objc protocol NewMenuItemHandling {
  func new()
} 

Vous prenez le protocole informel (un objet qui répond au nouveau sélecteur) et en faites un protocole formel.

Ensuite, où vous voulez utiliser le sélecteur, vous pouvez ajouter l'expression:

#selector(NewMenuItemHandling.new)
8
Scott Thompson

Dans cette situation respondsToSelector spéciale, où vous n'avez aucune méthode existante à laquelle associer une référence de fonction, écrivez ceci: 

UIApplicationShortcutItem.respondsToSelector(Selector("new"))

Vous recevrez toujours un avertissement (vous ne devriez pas, et j'ai déposé un bogue contre celui-ci), mais il s'agira d'un avertissement différent et vous pourrez l'ignorer.

2
matt

En résumé, chaque "sélecteur: fonction ou objet" est maintenant "sélecteur: #sélecteur (classe.funtion (_ :))", où qu'il soit utilisé.

0
Ade