1

J'ai découvert que lorsque mon programme démarre, dans un de mes viewcontrollers l'ordre d'appel est viewDidAppear, viewWillAppear, viewDidAppear.viewDidAppear appelé deux fois, mais viewWillAppear a appelé une fois

Je ne m'attendais pas à ce que le premier viewDidAppear soit appelé. Qu'est-ce qui pourrait causer cela et comment puis-je le réparer? ATM J'ai un drapeau dans viewDiDAppear pour vérifier si viewWillAppear a été appelé, mais c'est un hack.

Le stacktrace (qui est identique dans les appels de bot à viewDidAppear) est:

#0 0x0000509e in -[MainView viewDidAppear:] at MainView.m:497 
#1 0x3097e96e in -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] 
#2 0x30af3abe in -[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:] 
#3 0x30af4930 in -[UINavigationTransitionView _navigationTransitionDidStop] 
#4 0x3091af0d in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] 
#5 0x3091ba9e in +[UIViewAnimationState popAnimationState] 
#6 0x30af46fd in -[UINavigationTransitionView transition:fromView:toView:] 
#7 0x30af3b01 in -[UINavigationTransitionView transition:toView:] 
#8 0x30979f09 in -[UINavigationController _startDeferredTransitionIfNeeded] 
#9 0x30a97d9c in -[UILayoutContainerView layoutSubviews] 
#10 0x0040bd94 in -[CALayer layoutSublayers] 
#11 0x0040bb55 in CALayerLayoutIfNeeded 
#12 0x0040b3ae in CA::Context::commit_transaction 
#13 0x0040b022 in CA::Transaction::commit 
#14 0x308f942a in -[UIApplication _reportAppLaunchFinished] 
#15 0x308fef33 in -[UIApplication handleEvent:withNewEvent:] 
#16 0x308fad82 in -[UIApplication sendEvent:] 
#17 0x309013e1 in _UIApplicationHandleEvent 
#18 0x32046375 in PurpleEventCallback 
#19 0x30245560 in CFRunLoopRunSpecific 
#20 0x30244628 in CFRunLoopRunInMode 
#21 0x308f930d in -[UIApplication _run] 
#22 0x309021ee in UIApplicationMain 
#23 0x00001e82 in main at main.m:14 
+0

pouvez-vous s'il vous plaît partager votre hiérarchie de vue? Qu'est-ce qui est ajouté à la fenêtre? qu'est ce que rootViewController dans UINavigationController? etc –

+0

Partagez du code. Vérifiez une faute d'orthographe de la méthode viewWillAppear. – coneybeare

Répondre

0

Mettez un point de rupture dans viewDidAppear, inspectez la pile d'appels dans le débogueur. Il vous dira ce qui appelle la méthode.

+0

Je l'ai fait, mais ils viennent tous les deux de la main, en particulier UIApplicationMain (...) –

+0

Pourquoi ne pas ajouter les traces de la pile ici. – coneybeare

+0

S'il vous plaît ajouter les traces de la pile ici, oui – Fab1n

-1

Il est très probable que vous vouliez le comportement de viewDidLoad plutôt que viewDidAppear - viewDidAppear peut être appelé plusieurs fois par votre ViewController lorsque vous ne l'attendez pas.

+0

Non. Je veux le viewDidAppear. Vous ne répondez pas à la question que j'ai posée. Encore une fois: Pourquoi viewDidAppear est-il appelé sans viewWillAppear correspondant? –

0

Lorsque viewDidAppear est appelée, pouvez-vous annuler un autre viewDidAppear dans la file d'attente des événements en suivant la méthode? Parfois, j'utilise ceci pour éviter que certaines méthodes soient appelées deux fois ou plus.

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(viewDidAppear) object:nil]; 
1

Je viens de rencontrer un problème très similaire. Dans mon cas, c'était à cause d'un bug de l'ECSlidingViewController (https://github.com/edgecase/ECSlidingViewController). Je viens de mettre à jour le code de github, résolu le problème.

L'utilisation d'un ECSlidingViewController, au-dessus du uikit navigationController, a rendu deux fois le viewDidAppear de l'enfant.

Questions connexes