2016-02-22 21 views
5

So che questa è una domanda generica, ma spero che qualcuno con un'esperienza simile possa avere un'idea di ciò che probabilmente sta accadendo.Arresto del layout automatico su iOS 9 con layout automatico disabilitato

Si verifica un arresto anomalo che si verifica solo su iOS 9 nella nostra app solo per iPad. Dice NSInternalInconsistencyException.

Si verifica sia in modalità Verticale che Orizzontale e su molte generazioni di iPad (iPad 2, iPad Pro, iPad 4, ...).

Non ho il layout automatico abilitato in qualsiasi punto del progetto, ma sembra un problema di layout automatico.

È molto difficile da replicare, quindi non riesco a eseguirne il debug su Xcode, ma visualizzo rapporti sul servizio di analisi degli arresti anomali "Crashlytics". Ecco la traccia dello stack da Crashlytics:

Auto layout internal error. Cannot find an outgoing row 
head for incoming head <unknown var (bug!) with engine as delegate[...] 

Thread : Fatal Exception: NSInternalInconsistencyException 
0 CoreFoundation     0x23d4568b __exceptionPreprocess 
1 libobjc.A.dylib    0x356c2e17 objc_exception_throw 
2 CoreFoundation     0x23d455d1 -[NSException initWithCoder:] 
3 Foundation      0x24a873b3 -[NSISEngine minimizeConstantInObjectiveRowWithHead:] 
4 Foundation      0x24a86e4d -[NSISEngine optimize] 
5 Foundation      0x24a82a53 -[NSISEngine withBehaviors:performModifications:] 
6 UIKit       0x27e040bb -[UIView(Hierarchy) _postMovedFromSuperview:] 
7 UIKit       0x280fb227 __UIViewWasRemovedFromSuperview 
8 UIKit       0x27e02ddb -[UIView(Hierarchy) removeFromSuperview] 
9 UIKit       0x282e5fa9 -[UIKeyboardPredictionView setPredictionViewState:animate:notify:] 
10 UIKit       0x281e3787 -[UIKeyboardImpl updatePredictionView] 
11 UIKit       0x27f155e3 -[UIKeyboardImpl finishLayoutChangeWithArguments:] 
12 UIKit       0x27e31437 -[UIKeyboardImpl updateLayout] 
13 UIKit       0x27e36077 -[UIKeyboardImpl setDelegate:force:] 
14 UIKit       0x27e2f6e1 -[UIPeripheralHost(UIKitInternal) _reloadInputViewsForResponder:] 
15 UIKit       0x27e2f20d -[UIResponder(UIResponderInputViewAdditions) reloadInputViews] 
16 UIKit       0x27e8d853 -[UIResponder becomeFirstResponder] 
17 UIKit       0x27e8db6d -[UIView(Hierarchy) becomeFirstResponder] 
18 UIKit       0x27f12289 -[UITextField becomeFirstResponder] 
19 UIKit       0x27fbe69f -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setFirstResponderIfNecessary] 
20 UIKit       0x27fbdc75 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) oneFingerTap:] 
21 UIKit       0x28334e27 _UIGestureRecognizerSendTargetActions 
22 UIKit       0x27fa2303 _UIGestureRecognizerSendActions 
23 UIKit       0x27e3a7af -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] 
24 UIKit       0x28335f2f ___UIGestureRecognizerUpdate_block_invoke809 
25 UIKit       0x27dfc287 _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks 
26 UIKit       0x27df9e77 _UIGestureRecognizerUpdate 
27 UIKit       0x27e386f9 -[UIWindow _sendGesturesForEvent:] 
28 UIKit       0x27e37e43 -[UIWindow sendEvent:] 
29 UIKit       0x27e097e5 -[UIApplication sendEvent:] 
30 UIKit       0x27e07fdf _UIApplicationHandleEventQueue 
31 CoreFoundation     0x23d08c3f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ 
32 CoreFoundation     0x23d0882d __CFRunLoopDoSources0 
33 CoreFoundation     0x23d06b9b __CFRunLoopRun 
34 CoreFoundation     0x23c5a249 CFRunLoopRunSpecific 
35 CoreFoundation     0x23c5a035 CFRunLoopRunInMode 
36 GraphicsServices    0x2cd24ad1 GSEventRunModal 
37 UIKit       0x27e6f899 UIApplicationMain 
38 Mr Appliance     0xcda7b main (main.m:16) 
39 libdyld.dylib     0x35e0e873 start 

Il problema è che io non so dove nel codice questo sta accadendo. La traccia dello stack non mostra in quale punto del codice si è verificato l'arresto anomalo. Dice solo linea main.m 16 che è return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));.

+0

E cosa vuoi fare? Hai il codice; noi no. Non abbiamo idea di cosa stia succedendo in questo momento; tu fai. – matt

+0

@matt Non so dove sta accadendo nel codice.La traccia dello stack non dice dove. Dice solo "main.m line 16". – Carl

+0

E ti aspetti che _us_ lo sappia? Tu sei quello che ha il codice e sa cosa fa l'app, non noi! Hai le stesse informazioni che abbiamo (il rapporto sugli arresti anomali) più il codice. È ovvio che tipo di cosa è successo; l'utente ha toccato qualcosa, un campo di testo sta diventando il primo risponditore e la tastiera appare. Cos'altro si può dire qui qualcuno? – matt

risposta

1

Quella riga in main.m è il punto in cui il programma si avvia, non dove si verifica l'errore. L'eccezione è generata al primo posto in cima alla lista dopo che tutti gli altri elementi sono accaduti. Il problema sta nel mezzo.

Dopo qualche vista viene rimosso dalla sua superview c'è un'eccezione, e lo fa mostrano errori NSISEngine indicando che forse AutoLayout viene attivata per alcuni XIB o Storyboard - oppure iOS sta utilizzando AutoLayout internamente per gestire la disposizione del nuovo layout .

This answer ha una traccia di stack quasi identica & punti con l'utilizzo di metodi di gesture non corretti per gestire le modifiche FirstResponder e ignorare una tastiera. Se stai facendo qualcosa di simile (ignorando qualche vista, modificando un UITableView?) Forse è con il metodo sbagliato che punta a un delegato che non esiste?

https://stackoverflow.com/questions/33800918/uitextfield-becomefirstresponder-crashes-the-ios-app-randomly

+0

Non ho metodi di gesture personalizzati in quella vista (o nell'intera app). Il link che mi hai fornito ha una traccia di stack identica, tranne che sta usando GlowingTextField mentre ho un normale UITextField. – Carl

0

Lo stacktrace indica un problema per quanto riguarda la tastiera su schermo. C'è una modifica del layout che finisce con un delegato non esistente. Sembra che il codice faccia scattare direttamente o indirettamente una modifica del layout relativa alla tastiera. La cosa è, una tastiera sullo schermo non è grattata anche quando la tua app riceve l'input.

Per quanto riguarda l'iPad Pro e la tastiera Smart, è possibile che sia presente una barra rapida e che possa essere nascosta. Molte app hanno problemi con le tastiere esterne.

Prova a connettere una tastiera bluetooth a uno dei tuoi dispositivi di prova. Collegalo a xcode, imposta un breakpoint sulle esecuzioni e prova i tuoi campi di testo. Indovina che troverai quello che stai cercando.

+0

Poiché si tratta di un'app B2B personalizzata, sappiamo che gli utenti non utilizzano una tastiera esterna, almeno non 26, quindi non può essere un problema di tastiera esterna. Ma sembra un problema di tastiera su schermo. – Carl

+0

Stai facendo delle ipotesi sul layout sullo schermo? Oppure questi utenti hanno un estensione di tastiera di terze parti sul loro dispositivo? –

+0

Ho aggiunto queste informazioni (sia che l'utente usi la tastiera di terze parti o meno) ai rapporti Crashlytics, e ho notato che nessuno di questi utenti usa una tastiera di terze parti. – Carl

0

Potrebbe essere stato un errore di ortografia del nome del controller o del xib durante l'avvio o potrebbe essere stato modificato, il nome del file o spostato nella cartella fisica e si dimentichi di rimuoverlo da xcode.

+0

Non può essere perché questo arresto si verifica solo su iOS 9, il che significa che gli utenti su iOS 7 e 8 non si verificano questo arresto anomalo. – Carl

Problemi correlati