如何根据条件设置初始视图控制器?
How to set initial view controller based on conditions?
根据条件用户是否登录到服务器显示不同的模板。如果用户没有登录到应用程序服务器需要显示 LoginViewController[UIViewController
] 否则显示 TabBarViewcontroller[UITabBarViewController
].
因为我是第一次使用 Storyboard。谁能建议我在情节提要中处理这种情况?
您可以 select 您的 ViewController 通过故事板名称:
UIStoryboard *yourStoryboard = [UIStoryboard storyboardWithName:@"yourstoryboard"
bundle:nil];
YourViewController *vc = [yourStoryboard instantiateViewControllerWithIdentifier:@"yourViewControllerIdentifier"];
然后呈现vc
在应用委托的 application:didFinishLaunchingWithOptions:
方法中创建 window 和所需的初始视图控制器:
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
if ([self isUserLoggedIn]) {
// Show the dashboard
self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"TabBarViewcontroller"];
} else {
// Login
self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
}
[self.window makeKeyAndVisible];
我是这样操作的
首先,您创建一个名为 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 是您当前的会话。正如您在代码中看到的那样,登录正在使用排队操作。
如果您需要更多详细信息,请联系我。
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
如果([self isUserLoggedIn]){
// 显示仪表板
self.window.rootViewController = [故事板实例化ViewControllerWithIdentifier:@"first"];
} 别的 {
// 登录
self.window.rootViewController = [故事板实例化ViewControllerWithIdentifier:@"second"];
}
根据条件用户是否登录到服务器显示不同的模板。如果用户没有登录到应用程序服务器需要显示 LoginViewController[UIViewController
] 否则显示 TabBarViewcontroller[UITabBarViewController
].
因为我是第一次使用 Storyboard。谁能建议我在情节提要中处理这种情况?
您可以 select 您的 ViewController 通过故事板名称:
UIStoryboard *yourStoryboard = [UIStoryboard storyboardWithName:@"yourstoryboard"
bundle:nil];
YourViewController *vc = [yourStoryboard instantiateViewControllerWithIdentifier:@"yourViewControllerIdentifier"];
然后呈现vc
在应用委托的 application:didFinishLaunchingWithOptions:
方法中创建 window 和所需的初始视图控制器:
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
if ([self isUserLoggedIn]) {
// Show the dashboard
self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"TabBarViewcontroller"];
} else {
// Login
self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
}
[self.window makeKeyAndVisible];
我是这样操作的
首先,您创建一个名为 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 是您当前的会话。正如您在代码中看到的那样,登录正在使用排队操作。
如果您需要更多详细信息,请联系我。
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
如果([self isUserLoggedIn]){
// 显示仪表板
self.window.rootViewController = [故事板实例化ViewControllerWithIdentifier:@"first"];
} 别的 {
// 登录
self.window.rootViewController = [故事板实例化ViewControllerWithIdentifier:@"second"];
}