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?
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.
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)
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.
En résumé, chaque "sélecteur: fonction ou objet" est maintenant "sélecteur: #sélecteur (classe.funtion (_ :))", où qu'il soit utilisé.