Ho cercato sul Web e Stack Overflow per ore e non riesco a risolvere questo problema. Spero che tutti vedano il mio errore, perché non riesco a trovarlo.Il passaggio modale manuale non funziona, View Controller non è nella gerarchia delle finestre?
Ho una semplice applicazione basata su storyboard che ho appena iniziato. Il ViewController iniziale è un'istanza di UITabBarController con i due ViewController fittizi del modello. All'avvio ho bisogno di verificare se il dispositivo è connesso a un servizio esterno. In caso contrario, mostrerò un ViewController modale che permetterà all'utente di autenticare, se il dispositivo è autenticato, mostrerò solo il FirstViewController.
I seguenti passaggi sono tutto ciò che ho fatto dopo la creazione del progetto:
- Creare la scena AuthenticateViewController sulla Storyboard
- Creare file di codice per AuthenticateViewController, e assegnarli alla scena corrispondente
- Crea file di codice per una sottoclasse UITabBarController e associare la scena UITabBarController iniziale alla nuova sottoclasse
- Creare un nuovo seguito sullo storyboard dalla scena UITabBarController agli Authenti cateViewController scena
- chiamare manualmente la segue da
viewDidLoad
nella sottoclasse UITabBarController
Quando eseguo l'applicazione segue modale non scatta, viene mostrato il primo ViewController del UITabBarController, e ottengo il seguente output in XCode :
Warning: Attempt to present <AuthenticateViewController: 0x83c0c10> on <EPTabBarController: 0x83be600> whose view is not in the window hierarchy!
Codice pertinente riportato di seguito, in effetti l'unico codice che ho aggiunto fino ad ora. Per favore fatemi sapere se screenshot o informazioni aggiuntive sarebbero utili. Grazie in anticipo per il vostro aiuto.
EPTabBarController, sottoclasse di UITabBarController:
#import "EPTabBarController.h"
#import "AuthenticateViewController.h"
@interface EPTabBarController()
@end
@implementation EPTabBarController
- (void)viewDidLoad
{
[super viewDidLoad];
[self performSegueWithIdentifier:@"authenticationSegue" sender:self];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
Questo funziona, ma mi sembra una soluzione piuttosto inelegante. È questo l'unico modo per realizzare questo? La chiamata 'performSegueWithIdentifer:' dovrebbe essere messa altrove? – blundin
Ehi, @blundin, prova a impostare afterDelay: 0.0 e controlla. fammi sapere se funziona senza problemi –
Sì, funziona perfettamente. Grazie. – blundin