Avec la beta 3 de Xcode, le code suivant ne fonctionne plus:
func keyboardWasShown (notification: NSNotification) { var info = notification.userInfo keyboardSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey).CGRectValue().size }
à l'instruction:
keyboardSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey).CGRectValue().size
XCode renvoie l'erreur [NSObject: AnyObject] n'a pas de membre nommé objectForKey.
J'ai donc changé le code comme ceci:
func keyboardWasShown (notification: NSNotification) { var info = notification.userInfo keyboardSize = info[UIKeyboardFrameBeginUserInfoKey].CGRectValue().size }
mais XCode renvoie l'erreur "La string n'est pas un sous-type f DictionaryIndex"
À partir de Xcode 6 Beta 3, NSDictionary*
est maintenant importé à partir des API Objective-C en tant que [NSObject : AnyObject]
(ce changement est documenté dans les notes de publication).
Vous pouvez donc accéder à la valeur du dictionary avec info[UIKeyboardFrameBeginUserInfoKey]
. Cela donne un AnyObject
que vous devez NSValue
en NSValue
, de sorte que CGRectValue()
peut être appliqué:
var info = notification.userInfo let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as NSValue).CGRectValue().size
Le message d'erreur
'Ssortingng' n'est pas un sous-type de 'DictionaryIndex'
est assez trompeur, le problème avec votre deuxième tentative est seulement la dissortingbution manquante.
Mise à jour pour Xcode 6.3: notification.userInfo
est maintenant un dictionary optionnel et doit être déballé, par exemple avec une binding optionnelle. Aussi l'opérateur de casting forcé a été renommé en as!
:
if let info = notification.userInfo { let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue().size } else { // no user info }
Nous pouvons NSValue
de la valeur du dictionary car il est documenté pour être un NSValue
d'un CGRect
.