web-dev-qa-db-fra.com

[NSObject: AnyObject]? ' n'a pas de membre nommé erreur 'indice' dans Xcode 6 beta 6

J'ai utilisé les quelques lignes de code ci-dessous pour obtenir le cadre du clavier lorsqu'il s'affiche à l'écran. Je me suis inscrit à la notification UIKeyboardDidShowNotification.

func keyboardWasShown(notification: NSNotification) {
    var info = notification.userInfo
    var keyboardFrame: CGRect = info.objectForKey(UIKeyboardFrameEndUserInfoKey).CGRectValue()
}

Cela fonctionnait auparavant en version bêta 5. J'ai téléchargé la dernière version de Xcode 6 qui est la version bêta 6 et cette erreur s'est produite à la deuxième ligne.

'[NSObject: AnyObject]?' n'a pas de membre nommé 'objectForKey'

Après quelques recherches sur Google, je suis tombé sur la solution this . Et je l'ai changé comme ça,

var keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue()

Mais il semble que ce soit aussi dépassé maintenant. Parce que je reçois cette erreur maintenant.

'[NSObject: AnyObject]?' n'a pas de membre nommé 'indice'

Je ne peux pas comprendre cette erreur ni comment la résoudre.

24
Isuru

Comme mentionné dans les notes de version Xcode 6 beta 6, un grand nombre d'API Foundation ont été auditées pour la conformité facultative. Ces modifications remplacent T! soit T? ou T selon que la valeur peut être nulle (ou non) respectivement.

notification.userInfo est maintenant un dictionnaire facultatif:

class NSNotification : NSObject, NSCopying, NSCoding {
    // ...
    var userInfo: [NSObject : AnyObject]? { get }
    // ...
}

vous devez donc le déballer. Si vous savez que userInfo n'est pas nil alors vous pouvez simplement utiliser un "déballage forcé":

var info = notification.userInfo!

mais notez que cela plantera au moment de l'exécution si userInfo est nil.

Sinon, utilisez mieux une affectation facultative:

if let info = notification.userInfo {
    var keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
} else {
    // no userInfo dictionary present
}
41
Martin R