Aby wyświetlić ekran logowania po załadowaniu aplikacji, a nie po zalogowaniu się użytkownika, postanowiłem dodać obiekt uwierzytelniający w pliku NSUserDefaults, gdy użytkownik loguje się pomyślnie. Po uruchomieniu aplikacji sprawdzany jest parametr auth, a kontroler widoku jest odpowiednio ustawiony (jeśli użytkownik jest uwierzytelniony, wyświetli kanał informacyjny, jeśli nie wyświetli ekranu logowania). W tym drugim przypadku mam aplikację Deleguj zresetować kontroler widoku głównego do kanału po zalogowaniu użytkownika. Czy ta zła praktyka czy jest lepszy sposób na zrobienie tego?Zmiana kontrolera widoku głównego po załadowaniu aplikacji systemu iOS.
W app delegata:
- (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];
}
W logowania widoku kontrolera:
- (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];
}
}
}
Zastanawiam się, czy istnieje lepszy sposób niż lub łatwiej robić. Dziękuję Ci!
dlaczego nie można dodać prosty 'UINavigationController' jako' rootViewController', a ty po prostu nie popchnij ekran logowania do stosu nawigacji, jeśli użytkownik już się zalogował.byłoby to o wiele łatwiejsze i znacznie bardziej eleganckie niż obecne rozwiązanie. – holex
@holex Jeśli pasek kart jest również potrzebny po zalogowaniu, dodanie kontrolera UINavigationController nie byłoby opcją, prawda? – Donald