Répétition des notifications inutiles
Bonjour à tous !
Je sais qu'il faut utiliser une notification pour réduire une UITableView lorsque le clavier apparait. Le problème est que les notifications se répètent. Je m'explique : lorsque je clique sur un UITextField, le clavier apparait, et une seule notification est envoyée. Lorsque je clique sur back, le clavier disparait et une seule notification est envoyée.
Cependant, si je recommence, il y a 2 puis 3... notifications. Et donc, le système ne fonctionne plus.
Donc, j'ai changé le code et ça fonctionne, sauf que le nombre de notifications est démultiplié à chaque fois. Comment faire pour n'envoyer qu'une seule notification ?
Je vous montre mon code :
Dans le ViewDidLoad:
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(adjustForKeyboard), name: Notification.Name.UIKeyboardWillHide, object: nil)
notificationCenter.addObserver(self, selector: #selector(adjustForKeyboard), name: Notification.Name.UIKeyboardWillChangeFrame, object: nil)
La fonction qui envoie la notification :
@objc func adjustForKeyboard(notification: Notification) {
let userInfo = notification.userInfo!
let keyboardScreenEndFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
let keyboardViewEndFrame = view.convert(keyboardScreenEndFrame, from: view.window)
if notification.name == Notification.Name.UIKeyboardWillHide {
viewTableView.contentInset = UIEdgeInsets.zero
} else {
viewTableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: keyboardViewEndFrame.height, right: 0)
}
viewTableView.scrollIndicatorInsets = viewTableView.contentInset
}
Je vous remercie pour votre aide !
Réponses
Oui effectivement... Le problème vient du fait que tu n'utilises pas les autolayouts. Si tu utilisais cette mécanique, tu n'aurais pas besoin de déclarer plusieurs observateurs, seul le UIKeyboardWillChangeFrame te serait utile.
Les autres corrigeaient moi si je dis une bêtise...
A mon avis la notification est envoyé qu'une seule fois. Cependant tu fois avoir plusieurs "observer" mis en place qui réceptionne cette notification:
- Utilises-tu removeObserver quelque-part dans ton code ?
- Est-il réellement appelé (par exemple si l'appel est dans deinit, est ce que l'instance de ton VC est réellement libéré)
ViewDidUnload: unregister.
Voici une logique possible.
Tu peux faire sinon sur viewDidAppear/viewDidDisappear...
Mais il me semble qu'iOS11 a un p'tit soucis avec les unregister...
Mais je comprends pas là ... Avec l'autolayout il a besoin d'un déclarer qu'un seul. Non ?
Je vous remercie pour vos réponses.
Pour être franc, j'ai cherché sur Internet, j'ai fait un copié collé, et je n'ai malheureusement pas chercher à comprendre.
Voilà le lien du code que j'ai copié :
https://www.hackingwithswift.com/example-code/uikit/how-to-adjust-a-uiscrollview-to-fit-the-keyboard
Et si vous connaissez des tutoriels sur les notifications, je suis preneur. Et oui, j'ai encore des choses à apprendre.
Je n'utilise pas removeObserver. Je vais me renseigner de ce pas !
Je ne pense pas que l'instance de mon VC est libérée.
J'ai utilisé :
Mais apparemment, ça ne fonctionne pas...
Cependant, removeObserver est bien appelé dans le ViewDidDisapear().
C'est mieux. Ce que je ne comprend pas, c'est que lorsque le clavier disparait, il y a deux notifications. Mais c'est peut-être parce qu'il y a deux observateurs pour une même fonction...
J'ai besoin des deux observateurs, car la view doit retrouver sa taille normale lorsque le clavier est caché.
Comment faire avec l'autolayout ?