Per visualizzare la schermata di accesso quando viene caricata l'app, e non dopo che l'utente ha effettuato l'accesso, ho deciso di aggiungere un oggetto auth in NSUserDefaults quando l'utente ha effettuato l'accesso. Quando l'app viene avviata, il parametro auth viene controllato e il controller della vista viene impostato di conseguenza (se l'utente è auth mostrerà un feed, altrimenti visualizzerà una schermata di accesso) In quest'ultimo caso, ho l'app delegato reimposta il controller della vista radice sul feed dopo che l'utente ha effettuato l'accesso. È una cattiva pratica o esiste un modo migliore per farlo?Modifica del controller di visualizzazione radice dopo il caricamento dell'applicazione iOS.
Nel app delegato:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
IIViewDeckController* deckController = [self generateControllerStack];
self.rightController = deckController.rightController;
self.centerController = deckController.centerController;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if([[defaults objectForKey:@"auth"] isEqualToNumber:[NSNumber numberWithInt:1]]){
self.window.rootViewController = deckController;
}else{
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle:nil];
UIViewController* vc = [sb instantiateViewControllerWithIdentifier:@"loginViewController"];
self.window.rootViewController = vc;
}
[self.window makeKeyAndVisible];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO];
return YES;
}
- (void) setRoots
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
IIViewDeckController* deckController = [self generateControllerStack];
self.rightController = deckController.rightController;
self.centerController = deckController.centerController;
self.window.rootViewController = deckController;
[self.window makeKeyAndVisible];
}
Nella login vista del regolatore:
- (IBAction)loginClick:(id)sender {
if([_emailField.text length]>0&&[_passField.text length]>0){
NSString *user = _emailField.text;
NSString *pass = _passField.text;
[[API sharedInstance] login:user andPass:pass onCompletion:^(NSDictionary *json){
NSLog(@"%@", json);
if(![json objectForKey:@"error"]){
[API sharedInstance].authorized = 1;
NSNumber *auth = [NSNumber numberWithInt:1];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:auth forKey:@"auth"];
[defaults synchronize];
captureYouAppDelegate *app = [[UIApplication sharedApplication] delegate];
[app setRoots];
}else{
[API sharedInstance].authorized = 0;
}
}];
}else{
if([_emailField.text length]<1){
[_emailField becomeFirstResponder];
}else{
[_passField becomeFirstResponder];
}
}
}
Mi chiedo se c'è un modo migliore o più facile di farlo. Grazie!
perché non aggiungi un semplice '' UINavigationController' come rootViewController', e basta non spingere la schermata di accesso nello stack di navigazione se l'utente ha già effettuato l'accesso.sarebbe molto più semplice e molto più elegante della tua attuale soluzione. – holex
@holex Se la barra delle schede è necessaria anche dopo l'accesso, aggiungere un UINavigationController non sarebbe un'opzione, giusto? – Donald