2017-02-05 4 views
0

Mon application a été publié récemment, mais il prend en charge iOS 8.2.addTarget de contrôle segmentée() app iOS 9.0 ci-dessous s'écraser

Malheureusement, au-dessous iOS 9.0 tapotant un contrôle segmenté qui a été ajoutée l'application se bloque programme sans message d'erreur dans la console.

Je crois que la ligne où la cible est ajoutée peut provoquer le problème:

La ligne suivante est placée à l'intérieur du init() de ma cellule personnalisée, le contrôle segmentée est une instance var et appelle une méthode son contrôleur de vue parent

segmentedControl.addTarget(ListViewController(), action: #selector(ListViewController.segmentedControlToggled(segmentedControl:)), for: .valueChanged) 

Encore une fois, cela fonctionne comme prévu jusqu'à iOS 9.0.

L'installation fonctionne très bien, il se bloque une seule fois le contrôle segmentée est exploité.

Faut-il une autre syntaxe pour le sélecteur?

Merci pour vos suggestions!

Répondre

2

par la documentation de addTarget:

Le contrôle ne conserve pas l'objet dans le paramètre cible. Il est de votre responsabilité de maintenir une référence forte à l'objet cible lorsqu'il est attaché à un contrôle.

Ce qui signifie que vous devez stocker la valeur du paramètre target quelque part, chose que vous ne parviennent pas à atteindre:

segmentedControl.addTarget(ListViewController(),...) 

Le ListViewController va obtenir désattribuées dès qu'il n'y aura pas d'autres références à ce , la chose importante à retenir ici est que vous ne pouvez pas savoir à l'avance quand la désallocation se produira, car vous ne savez pas comment d'autres objets peuvent renvoyer votre objet.

Pour vous assurer de la cible ne soit pas désalloué, stocker l'instance ListViewController dans une propriété.

Le plantage n'est pas particulier à la version iOS, il se peut que sur une version iOS, le ListViewController soit désalloué plus tôt.

+0

Merci beaucoup, Cristik, j'ai oublié cela. Je l'ai changé et ça a réglé le problème! Cependant, je suis toujours perplexe quant à la raison pour laquelle cela fonctionne dans toutes les versions au-dessus de 8.4, mais pas ci-dessous. – nontomatic

+1

@nomatique Il se peut que la cible soit attrapée (retenue) par d'autres objets qui la maintiennent indirectement en vie. Et iOS 8.3 et ci-dessous n'a pas ces objets. Fondamentalement, votre application fonctionne bien à partir de 8.4 en raison de certains détails de mise en œuvre de UIKit, mais comme ceux-ci sont hors de votre contrôle, vous feriez mieux de garder une référence solide pour vous-même. – Cristik

+0

Merci pour le suivi, ça a du sens, merci! – nontomatic