2015-03-10 12 views
6
- (void)awakeWithContext:(id)context { 
[super awakeWithContext:context]; 
    [WKInterfaceController reloadRootControllersWithNames:@[@"pageOne", @"pageTwo"] contexts:nil]; 
} 

Seguendo le linee guida di AppleBasato pagina "reloadRootControllersWithNames:" sul ciclo di avvio?

chiamare questo metodo per ricaricare le pagine in interfaccia basato sulla pagina della tua app. Al momento dell'avvio, si utilizza questo metodo per personalizzare il set di pagine che si desidera visualizzare.

in fase di avvio, genera solo un loop. Con ogni ricarica, chiama awakeWithContext o Attiva o avvia ancora e ancora.

Esiste un modo migliore per ricaricare l'app basata sulla pagina all'avvio con un ciclo che si verifica?

+0

awakewithcontext viene chiamato ogni volta che si chiama reloadRootControllersWithNames, ecco perché risulta in un ciclo. Basta configurare la navigazione di base della pagina predefinita nello storyboard –

+0

Sì, ho letto i documenti di Apple che percepivano erroneamente al momento del lancio, si supponeva che facesse tutto il lavoro per te. – devone

risposta

18

Questo è un problema comune con le app WatchKit poiché non abbiamo più un UIApplicationDelegate per gestire tale configurazione. Un buon approccio sarebbe quello di strutturare il codice come segue:

  • MainInterfaceController (il principale collegamento in punti storyboard qui)
  • PageOneInterfaceController - la vostra prima interfaccia per visualizzare nel set pagina
  • PageTwoInterfaceController - la vostra seconda interfaccia nel set di pagine

Il MainInterfaceController non verrà mai effettivamente visualizzato. Si avvierà sempre in un diverso set di controller di interfaccia a seconda dello stato della cache dell'app compagno iOS in MainInterfaceController.awakeWithContent(). In questo modo, si utilizza MainInterfaceController in modo simile a quello in cui si utilizza lo UIApplicationDelegate in iOS per impostare la finestra e il controller di visualizzazione radice.

Ho utilizzato questo approccio in un'app con diversi set di pagine tra cui scegliere e ha funzionato molto bene.

+0

Wow brillante, questo è un allenamento intelligente, stavo per usare un gruppo di booleani e non vedo l'ora. Grazie mille! – devone

+0

Felice di aiutare amico! – cnoon

+0

reloadRootControllersWithNames - questo non chiama disattivato sui controller che erano già presenti. Qualche soluzione se qualcosa deve essere fermato (come un timer) sul controller che era visibile? –

-1

Veramente facile da risolvere, e non richiede più controller Pagina - Basta usare una volta

Creare una variabile di classe (non una variabile di istanza) e utilizzarlo come bandiera per garantire che la chiamata a reloadRootControllers è solo mai chiamato una volta.

static NSString* hasLaunchedIfNotNullString = NULL; 

- (void)awakeWithContext:(id)context 
{ 
    if(hasLaunchedIfNotNullString == NULL) 
    { 
     //START Code which gets executed once 
     hasLaunchedIfNotNullString = @""; 

     ... 
     [WKInterfaceController reloadRootControllersWithNames:YOUR_ARRAY contexts:CONTEXTS]; 
     // END code which gets executed once 
    } 
} 
+0

L'utilizzo di un campo stringa come flag è generalmente una cattiva idea. –

3

Ecco perché esiste awakeWithContext:. La prima volta che viene lanciata l'app, il controller iniziale viene passato come nil come context. Ma se si reloadRootControllersWithNames:contexts:, si ha la possibilità di passare un'istanza di contesto personalizzata e quindi di distinguere la modalità di avvio.

+0

Questo è un approccio molto più semplice e pulito, grazie! – Dmorneault