Question

Cela semble assez inoffensif. Dans mon délégué aux applications, je vérifie NSUserDefaults qu'un indicateur affiche les astuces au démarrage. S'il est défini, à la fin de applicationDidFinishLaunching: , je le fais:

TipsViewController *vc = [[TipsViewController alloc]
  initWithNibName:@“TipsView" bundle:nil];
[window addSubview:vc.view];
[vc release];

L’idée est d’afficher cette vue temporairement. (Notez que ce n'est pas un VC modal. Pas de contrôleur de navigation à ce stade, plus aucune barre de navigation dans cette vue.)

Une fois cette vue supprimée, nous ajoutons notre vue UITabBarController & # 8217; préemptée à la fenêtre et y passons, puis supprimons la vue en pointe de la vue principale. la fenêtre. Je ne suis pas encore parvenu au point de vue de renvoi parce que, continuez à lire.

Le VC de My TipsView & # 8217; est câblé plus ou moins comme suit:

UIView -> view -> File’s Owner (TipsViewController)
  UIImageView -> background image
  UIView -> tipView -> File’s Owner
    UIImageView -> background image
    UIScrollView
      UILabel (tip text)
    UIButton -> touch-up-inside -> -(IBAction)button1:
    UIButton -> touch-up-inside -> -(IBAction)button2:
    UIButton -> touch-up-inside -> -(IBAction)button3:

La source contient des déclarations et des définitions pour les trois appels IBAction . À l'heure actuelle, deux d'entre eux ne font rien. Le troisième modifie le texte du conseil, le redimensionne et adapte le contentSize de la vue de défilement.

Lorsque j'exécute l'application, la vue TipsViewController s'affiche très bien. Je peux même faire défiler le texte du conseil. Cependant, lorsque je déclenche une retouche à l'intérieur de tout UIButton , Xcode commence à me planter dans le source (où j'ai placé un point d'arrêt à chaque IBAction ) & # 8230; et puis se sauve avec un EXC_BAD_ACCESS ou un obj_stack_overflow .

J'ai comparé cela à d'autres parties de l'application où j'ai un VC, une vue et des boutons. Il est identique à tous les égards sauf que, dans ce cas, I & # 8217; j'ai ajouté la vue d'un VC comme sous-vue de la fenêtre de l'application au lieu de placer le VC sur un contrôleur de navigation . De plus, le Guide de programmation de View Controller pour iPhone OS indique que ce jeu est équitable:

  

Si vous utilisez un seul contrôleur de vue dans   votre application, vous ajoutez sa vue à   une fenêtre au lieu d'ajouter la vue   contrôleur à une barre d'onglets ou de navigation   contrôleur.

Certes, j'ai un UITabBarController en attente, ainsi que des onglets contenant UINavigationControllers (et d'autres VC). Toutefois, si la vue tip est affichée, la vue du contrôleur de la barre d’onglet n’a pas encore été ajoutée à la fenêtre. Le but est de l’échanger après que nous ayons fini de montrer des astuces. En d'autres termes, à toutes fins pratiques, nous agissons temporairement comme si nous n'avions qu'un seul VC en jeu. Ensuite, nous basculons sur la barre d’onglet et démontons la VC d’extrémité.

Peut-être que je fais quelque chose de subtilement faux? Y a-t-il un meilleur moyen? (Il doit exister un meilleur moyen! & # 8221;)

Exemple de trace de pile:

#0  0x992b6f52 in objc_exception_throw
#1  0x302d6ffb in -[NSObject doesNotRecognizeSelector:]
#2  0x3026e056 in ___forwarding___
#3  0x3024a0a2 in __forwarding_prep_0___
#4  0x308f79d1 in -[UIApplication sendAction:to:from:forEvent:]
#5  0x309598b1 in -[UIControl sendAction:to:forEvent:]
#6  0x3095bad2 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
#7  0x3095a81e in -[UIControl touchesEnded:withEvent:]
#8  0x30910fdf in -[UIWindow _sendTouchesForEvent:]
#9  0x308faecb in -[UIApplication sendEvent:]
#10 0x309013e1 in _UIApplicationHandleEvent
#11 0x32046375 in PurpleEventCallback
#12 0x30245560 in CFRunLoopRunSpecific
#13 0x30244628 in CFRunLoopRunInMode
#14 0x32044c31 in GSEventRunModal
#15 0x32044cf6 in GSEventRun
#16 0x309021ee in UIApplicationMain
#17 0x00002888 in main at main.m:14

Comme vous pouvez le constater à partir de la trace, nous aboutissons à doesNotRecognizeSelector: & # 8230; sauf que je peux clairement voir les méthodes dans mon source VC. De plus, ils sont tous câblés. (Pas de câblages multiples ni quoi que ce soit de pareil dans IB. Tout y est beau, jusqu'aux relations entre le propriétaire du fichier et le propriétaire.)

Des indices bienvenus / appréciés!

Était-ce utile?

La solution

Le problème réside dans votre premier extrait de code: vous créez une instance de TipsViewController, conservez sa vue, puis relâchez le contrôleur de vue, ce qui entraînera sa désallocation. Alors maintenant, la cible des boutons est un pointeur sur le contrôleur de vue désalloué.

Une vue ne conserve pas son contrôleur de vue, pas plus que ses délégués ou ses cibles.

Vous devez conserver l'instance du contrôleur de vue conservée & # 8212; peut-être dans une propriété retention & # 8212; aussi longtemps que vous souhaitez que la vue soit affichée. Lorsque vous en avez terminé avec la vue, vous pouvez la supprimer de la vue parent et relâcher le contrôleur de vue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top