2015-08-31 17 views
6

Il widget di oggi viene disegnato correttamente quando viene aggiunto alla vista di oggi. Ma se l'utente ci ritorna in un secondo momento, la funzione viewDidLoad non viene chiamata e sta visualizzando dati non aggiornati. Dovrebbe viewDidLoad essere chiamato ogni volta? Esiste un bug di iOS 9/Xcode 7 beta 6?iOS 9 Oggi Widget non chiama viewDidLoad

Modifica: Aggiunto che widgetPerformUpdateWithCompletionHandler non chiamato. Ho i punti di interruzione impostati e funzioni di stampa

func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)) { 
    print("in widgetPerformUpdateWithCompletionHandler") 
    fetch() 

    completionHandler(NCUpdateResult.NewData) 
} 
+0

Non ho mai lavorato con i widget ma normalmente 'viewDidAppear' viene chiamato ogni volta che viene presentata una schermata,' viewDidLoad' viene chiamato solo quando la vista è inizialmente caricata. –

+0

Non stai usando 'widgetPerformUpdateWithCompletionHandler:' vedi [qui] (https://developer.apple.com/library/ios/documentation/NotificationCenter/Reference/NCWidgetProviding_Protocol/index.html#//apple_ref/occ/intfm/NCWidgetProviding/ widgetPerformUpdateWithCompletionHandler :) – soulshined

+3

Ho lo stesso problema. 'widgetPerformUpdateWithCompletionHandler' veniva chiamato ogni volta che veniva visualizzato il widget. iOS9 chiama questo metodo molto meno. Ma non ho trovato alcuna documentazione su questo cambiamento. –

risposta

0

Diffusione mia risposta, ma vorrei la discussione su questo codice - dovrebbe essere lì o come farlo correttamente ?. Abbiamo avuto in questo metodo, e rimuovendolo il widget cominciato a funzionare correttamente

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 
{ 

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) 

    if let safeCoordinator = coordinator as UIViewControllerTransitionCoordinator? 
    { 
     print("coordinator != nil") 
     safeCoordinator.animateAlongsideTransition({ context in 
      self.tableView.frame = CGRectMake(0, 0, size.width, size.height) 
      }, completion: nil) 

    } 
    else 
    { 
     print("coordinator == nil") 
    } 
} 
+0

Questo codice sembra che tu stia cercando di ridimensionare la tua vista tabella in risposta a qualcos'altro che modifica l'altezza della tua vista. Cos'è qualcos'altro? Se stai usando il layout automatico, la tua vista tabella dovrebbe ridimensionarsi per adattarsi al numero di celle visualizzate. Altrimenti puoi impostare [preferredContentSize] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instp/UIViewController/preferredContentSize) per specificare esattamente l'altezza desiderata . –

+0

@ChristopherPickslay Apple non scoraggia l'uso di preferredContentSize? – Supertecnoboff

+1

@Supertecnoboff di cui non sono a conoscenza: 'Se non si utilizza Auto Layout, è possibile utilizzare la proprietà UIViewController preferredContentSize per richiedere un'altezza per il widget. Https://developer.apple.com/library/ios /documentation/General/Conceptual/ExtensibilityPG/Today.html#//apple_ref/doc/uid/TP40014214-CH11-SW5 –

5

Quando si scorre un widget fuori ed indietro sullo schermo, la stessa istanza di controllo sarà riutilizzato per un breve lasso di tempo (sembra essere ~ 30 secondi nel mio test), e viewDidLoad e widgetPerformUpdateWithCompletionHandler: non saranno chiamati.

Tuttavia, viewWillAppear e viewDidAppear verranno chiamati ogni volta che viene visualizzato il widget.

+0

Questo ha risolto il problema anche per me – Rand

+0

Grazie sì, sono passato a viewDidAppear e ora tutto funziona, grazie:) – Supertecnoboff