2014-10-23 15 views
10

In base alla documentazione di Apple, "Per facilitare l'aggiornamento del widget, il sistema di volta in volta acquisisce istantanee della vista del widget .Quando il widget diventa nuovamente visibile, l'istantanea più recente viene visualizzata fino al sistema lo sostituisce con una versione live della vista. "La visualizzazione dell'interno lampeggia durante il ridisegno

Quello che sto vedendo, tuttavia, è che l'istantanea viene rimossa dallo schermo prima che venga preparata la visualizzazione live. Ciò si traduce in un effetto flash in cui la vecchia istantanea viene rimossa dallo schermo, la vista è vuota per una frazione di secondo, quindi viene visualizzata la nuova vista.

Lo sviluppatore è responsabile della transizione tra snapshot e live view? In tal caso, qual è la strategia che sta dietro a ciò? Non vedo alcun modo per controllare direttamente questa transizione.

sono stato in grado di mitigare l'effetto notevolmente spostando il caricamento dei dati di widgetPerformUpdateWithCompletionHandler: e mantenere il disegno in viewWillAppear :, ma io ancora vedono un lampo, una volta ogni 15 (o giù di lì) si apre il Centro di notifica.

risposta

20

Ho avuto questo stesso problema e alla fine ho capito il problema che avevo con il mio widget. Si scopre che è stato collegato a un malinteso sul Widget Life Cycle per mio conto.

Dalla documentazione ho pensato che la vista odierna avrebbe mantenuto una "istantanea" dello stato dei miei widget fino a quando il gestore del completamento del metodo widgetPerformUpdateWithCompletionHandler non è stato chiamato con successo.

Questo non sembra essere il caso. Da quello che posso vedere, l''istantanea' viene usata solo quando la Visualizzazione Oggi si sta animando (quando l'utente abbassa il centro notifiche). Non appena viene caricata la vista odierna, il widget viene caricato da zero (gonfiato da xib se in uso) e viene chiamato viewDidLoad. In questo momento è necessario popolare il widget con i dati memorizzati nella cache (non da una richiesta Web). Se non lo fai, vedrai dati temporanei dal tuo pennino. Questo è ciò che causa il lampeggiare.

Quando viewDidLoad è completo, viene chiamato il numero widgetPerformUpdateWithCompletionHandler che consente di recuperare nuovi dati. Quando vengono recuperati i nuovi dati, è necessario chiamare il gestore di completamento e memorizzare i dati in modo che possano essere utilizzati quando il widget viene caricato in seguito da zero (in viewDidLoad).

Un modo semplice per memorizzare nella cache i dati è nei valori predefiniti dell'utente.

+0

Beh, il tuo fraintendimento dello "scatto" equivale esattamente al mio fraintendimento dell'istantanea, a quanto pare. Grazie per la tua ricerca e input. Farò un tentativo e ti faccio sapere se risolve il mio problema con il flash (ho il sospetto che lo sarà, visto quello che hai descritto). – christopherdrum

+0

Grande. Fammi sapere se risolve il tuo problema :) – bencallis

+0

@christopherdrum Questo lavoro ha funzionato? In tal caso, ricorda di contrassegnarlo come risposta corretta per aiutare gli altri :) – bencallis

2

Devi essere attenti a vostro gestore compilation nel

- (void) widgetPerformUpdateWithCompletionHandler: (void (^) (NCUpdateResult)) completionHandler

metodo

. Quello che succede è che probabilmente la tua estensione ha un errore e ogni volta che la visualizzazione viene richiamata. Prova ad allegare la tua estensione al debugger (Debugger-> Attach to Process-> your extension id) e vedere il risultato mettendo alcuni punti di interruzione.

+0

Sì, ho eseguito estese operazioni di registrazione e rilevamento di punti di interruzione su questo problema. Se metto un punto di interruzione all'inizio di widgetPerformUpdateWithCompletionHandler: e attendo un momento, il contenuto del widget scompare completamente. Questo è prima di qualsiasi caricamento di dati o layout dell'interfaccia utente o altro. È vero che widgetPerformUpdateWithCompletionHandler: viene chiamato ogni volta che viene visualizzata la vista, ma ciò sembra coerente con la documentazione 8.1. Ciò che non è chiaro è quali metodi di controllo della vista sono chiamati in quale ordine e in quale momento per i widget. Non si comportano come i tipici controller di visualizzazione. – christopherdrum

+0

Si comportano in realtà se non ci sono errori. Non so nulla del tuo codice, ma c'è ed errore che lo causa in crash, ecco perché la tua vista scompare. Si prega di guardare nel registro di sistema del dispositivo per trovare il problema. –

+0

Bene, non vedo nulla nei registri degli arresti anomali. Ma continuerò con il tuo consiglio e vedrò se c'è qualche altro errore che non abbiamo ancora rilevato. – christopherdrum

Problemi correlati