2015-12-20 11 views
8

Ho un'applicazione multi-vista, con la seguente gerarchia:tentativo di presentare un UIViewController la cui vista non è nella finestra della gerarchia

splash -> controller di navigazione -> regolatore vista tabella -> Impostazioni View Controller

Splash è il punto di ingresso dell'applicazione e pertanto diventa il controller della vista radice. Quando cerco di aggiungere una tessera per la band tramite un azione sulle impostazioni di visualizzazione del controller, ottengo un avvertimento debugger:

applicazione [1929: 1.000.746] Attenzione: tentativo di presentare < MSBAddTileDialogViewController_iOS: 0x15f0575b0 > su < SplashViewController : 0x15dd597b0 > la cui vista non è nella gerarchia della finestra!

Questo succede immediatamente dopo la chiamata a MSBClient.tileManager addTile:completionHandler:. La chiamata non ritorna mai, non viene generato alcun errore.

Qualche suggerimento su come aggirare questo?

+1

Mi diletto solo nello sviluppo di iOS, quindi probabilmente non posso rispondere direttamente alla tua domanda. Quando aggiungi una tessera utilizzando Band SDK, tenterà di mostrare una finestra di conferma all'utente. Può darsi che la tua pila di controller non si sposti bene con il modo in cui Band SDK individua il controller appropriato su cui aggiungere il proprio controller di visualizzazione. Potrebbe essere necessario fornire più frammenti delle impostazioni del controller della vista per vedere come/quando nel suo processo di caricamento/visualizzazione si sta tentando di aggiungere la tessera. –

+0

@ phil-hoff-msft, grazie per averlo visto. Ecco [un esempio] (http://mikeradin.com/ModifiedBandTileEvent.zip). Ho modificato l'esempio incluso nel download dell'SDK di iOS per includere una vista provvisoria, rendendo l'interfaccia utente non il controller di visualizzazione radice. Lo stesso problema esiste. – chortik

+0

Questo è un problema noto poiché l'SDK sta tentando di presentare la finestra di dialogo di conferma sul controller della vista radice anche quando non fa parte della gerarchia della vista. L'unica soluzione per il momento è assicurarsi che il controller della vista radice venga presentato quando si esegue l'addTile: call. –

risposta

0

Sarà necessario ottenere il controller di visualizzazione radice ed eseguire un passaggio da quel controller di visualizzazione. Questo può essere abbastanza frustrante per il debug ma ci sono alcune risposte su questo argomento.

Ecco un codice che ho utilizzato per eseguire un passaggio dal controller della vista radice a uno schermo quando l'app riceve una notifica push.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"YourStoryboard" bundle:nil]; 

YourViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"viewcontrolleridentifier"]; 

UIViewController *top = [UIApplication sharedApplication].keyWindow.rootViewController; 

[top presentViewController:viewController animated:YES completion: nil]; 

Heres lo stesso codice in swift:

let storyboard = UIStoryboard.init(name: "YourStoryboard", bundle: nil) 

let viewController = storyboard.instantiateViewController(withIdentifier: "viewcontrolleridentifier") 

let top = UIApplication.shared.keyWindow?.rootViewController 

top?.present(viewController, animated: true, completion: nil) 

assicurarsi di impostare l'identificatore vista controller nel vostro storyboard.

EDIT * Se il controller della vista a cui si accede è incorporato all'interno di un controller di navigazione sarà necessario modificare il codice di cui sopra,

Objective C:

UIViewController *top = [self topMostController]; 

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[top presentViewController:navigationController animated:YES completion: nil]; 

Swift:

let top = UIApplication.shared.keyWindow?.rootViewController 

let navigationController = UINavigationController.init(rootViewController: viewController) 

top?.present(navigationController, animated: true, completion: nil)