Я сделал это следующим образом.
Во-первых, вы создаете нечто вроде LoginViewController. Он реализует логику входа в систему. Ваш корневой контроллер - UITabBarController.
Сейчас в AppDelegate:
- (void) doLogin:(NSDictionary *)dict
{
TransactionsViewController *transactions;
BalancesViewController *balances;
ProfileViewController *profile;
UINavigationController *navi;
UITabBarController *root;
root = (UITabBarController *)self.window.rootViewController;
navi = [root.viewControllers objectAtIndex:0];
transactions = [navi.viewControllers objectAtIndex:0];
transactions.delegate = self;
navi = [root.viewControllers objectAtIndex:1];
balances = [navi.viewControllers objectAtIndex:0];
balances.delegate = self;
navi = [root.viewControllers objectAtIndex:2];
profile = [navi.viewControllers objectAtIndex:0];
profile.delegate = self;
[transactions loadDataFromLogin:dict];
[balances loadDataFromLogin:dict];
[profile loadDataFromLogin:dict];
}
- (void) showLoginView
{
assert(loginController == nil);
assert(activityView == nil);
UITabBarController *tabbar = (UITabBarController *)self.window.rootViewController;
loginController = [tabbar.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
loginController.delegate = self;
[tabbar presentModalViewController:loginController animated:YES];
}
- (void) loginWithLogin:(NSDictionary *)dict relogin:(BOOL)relogin
{
NSString *_login = [dict valueForKey:@"email"];
NSString *_pass = [dict valueForKey:@"pass"];
NetworkOperation *op = [NetworkOperation operationLogin:_login pass:_pass];
[NetworkOperation enqueueOperation:op observer:self];
if (!relogin && !loginController)
[self doLogin:dict];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
session = nil;
loginController = nil;
return YES;
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
NSString *login = [[NSUserDefaults standardUserDefaults] stringForKey:@"email"];
NSString *pass = [[NSUserDefaults standardUserDefaults] stringForKey:@"pass"];
NSString *name = [[NSUserDefaults standardUserDefaults] stringForKey:@"name"];
if ((login == nil || login.length == 0) ||
(pass == nil || pass.length == 0) ||
(name == nil || name.length == 0)) {
if (!loginController) {
[self.window makeKeyAndVisible];
[self performSelector:@selector(showLoginView) withObject:nil afterDelay:0.1];
}
} else {
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:login, @"email",
pass, @"pass", name, @"name", nil];
[self loginWithLogin:dict relogin:(session != nil)];
}
}
Так что ваше приложение делегат проверяет если у вас есть пропуск и логин хранится. Если да, то он использует их для входа в систему и переключается на ваш контроллер корневого представления. В моем случае на вкладке отображается вкладка с вкладками с балансами, транзакциями и т. Д.
Если нет логина и пароля, то отобразите контроллер входа в систему сверху вашего контроллера корневого представления.
Здесь @session - это ваша текущая сессия. Вход в систему осуществляется с помощью операций, указанных в коде.
Если вам нужна дополнительная информация, просто пингуйте меня.
возможно дубликат [Условное Segue Использование Storyboard] (http://stackoverflow.com/questions/18947328/conditional-segue-using-storyboard) –
возможно дубликат [Условно начинаются в разных местах в раскадровке от AppDelegate] (http://stackoverflow.com/questions/8451975/conditionally-start-at-different-places-in-storyboard-from-appdelegate) – Razvan