2015-12-30 33 views
23

Ho un widget di oggi che contiene due cose:oggi widget tableView congela

  1. Un UILabel
  2. Un UITableView

Nel mio viewWillAppear ho impostato l'etichetta per essere visibili e la mia Tableview a essere nascosto e ho impostato il testo dell'etichetta su "Caricamento". Vedi l'immagine qui sotto.

Poi ricevo una posizione e quando questo è fatto, che io chiamo un altro metodo e

  1. Se non trovo alcun dato Ho appena aggiorno il testo dell'etichetta a "Non hai trovato i dati "
  2. Altrimenti impostare l'etichetta per essere nascosto e la tableView per essere visibile e mi metto l'aggiornamento dei dati

Quando questo è fatto con successo i ettaro Una tabellaView che assomiglia a questa:

.

Al mio problema ora.
Quando apro il mio widget di oggi e ha colpito viewWillAppear, Io non sempre riesco a impostare la mia etichetta e l'unico risultato che ottengo è questo

.

Quindi, quello che succede è che posso mostrare solo un po 'del mio risultato precedente in tableView.

Ciò accade occasionalmente e sembra che il TableView si blocchi e non riesca ad aggiornare la vista iniziale, per nascondere la tabellaView e mostrare invece l'etichetta. Anche quando lo schermo si blocca come questo, tutto funziona come dovrebbe e riesco ad aggiornare il TableView e la vista.

L'unico problema è quando ho aperto il widget che lo schermo si blocca in questo modo:

a volte invece di mostrare la mia etichetta. La ragione per cui è nella dimensione così com'è, è perché ho impostato il preferredContentSize = CGSizeMake(0, 30). Altrimenti scommetto che avrà mostrato l'intera tabella precedente.

Qualche idea su come risolvere questo problema, per aggiornare sempre la vista quando ho colpito viewWillAppear?

Aggiornamento
partire un altro di taglie per vedere se c'è qualche altro ingresso su questo tema.

+0

È possibile aggiungere del codice, ad esempio si effettua una richiesta di rete e quindi si analizza il risultato? Se sì, si riaccende() 'vista tabella? e nascondere l'etichetta. Se aggiungerai qualche implementazione forse potrei aiutarti – DeVladinci

+0

Mostraci il codice, non è possibile aiutare altrimenti! – jbg

+0

Ti stai conformando al protocollo 'NCWidgetProviding' e implementando' widgetMarginInsetsForProposedMarginInsets: 'già? – Ftoledo

risposta

10

Ciò che il sistema fa è che richiede un'istantanea. Ho anche sofferto un po 'con questo problema e ho controllato il post this ma non ha risolto il mio problema.

Per la widgetPerformUpdateWithCompletionHandler ci sono tre opzioni

  1. NCUpdateResultNewData - I nuovi contenuti che si tenuto a ridisegnare la vista
  2. NCUpdateResultNoData - Il widget non richiede l'aggiornamento
  3. NCUpdateResultFailed - Si è verificato un errore durante la processo di aggiornamento

Non importa quale di questi si chiami è sempre lo stesso risultato. E il sistema esegue uno snapshot.

Per aiutare il widget di guardare fino ad oggi, il sistema cattura di tanto in tanto istantanee di vista del widget. Quando il widget diventa nuovamente visibile , lo snapshot più recente viene visualizzato fino a quando il sistema sostituisce con una versione live della vista.

Per aggiornare lo stato di un widget prima che venga presa un'istantanea, assicurarsi di conforme al protocollo NCWidgetProviding. Quando il tuo widget riceve il widgetPerformUpdateWithCompletionHandler: chiamare, aggiornare vista il tuo widget di con il contenuto più recente e chiamare il gestore di completamento , utilizzando uno dei seguenti costanti per descrivere il risultato dell'aggiornamento

Reference.

Penso che stiamo forse cercando di caricare dati "pesanti" e questo potrebbe verificarsi a causa di ciò. Questa è la mia risposta, ma ho iniziato una taglia per verificare se qualcun altro ha un'altra risposta o se sei d'accordo con il mio post.