【问题标题】:How to set initial view controller based on conditions?如何根据条件设置初始视图控制器?
【发布时间】:2015-11-06 01:38:44
【问题描述】:

根据用户登录到服务器的条件或不显示不同的模板。如果用户没有登录应用服务器需要显示 LoginViewController[UIViewController] 否则显示 TabBarViewcontroller[UITabBarViewController]。

因为我是第一次使用 Storyboard。任何人都可以建议我在情节提要中处理这种情况吗?

【问题讨论】:

标签: ios objective-c iphone storyboard


【解决方案1】:

我是这样做的。

首先,您创建一个名为 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 是您当前的会话。正如您在代码中看到的,登录正在使用排队操作。

如果您需要更多详细信息,请联系我。

【讨论】:

    【解决方案2】:

    在应用委托的application:didFinishLaunchingWithOptions: 方法中创建窗口和所需的初始视图控制器:

    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];
    

    【讨论】:

      【解决方案3】:

      您可以通过故事板名称选择您的 ViewController:

       UIStoryboard *yourStoryboard = [UIStoryboard storyboardWithName:@"yourstoryboard"
                                                                bundle:nil];
       YourViewController *vc = [yourStoryboard instantiateViewControllerWithIdentifier:@"yourViewControllerIdentifier"];
      

      然后呈现vc

      【讨论】:

        【解决方案4】:

        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; if ([self isUserLoggedIn]) {
        // 显示仪表板 self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"first"]; } 别的 { // 登录 self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"second"]; }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-01
          • 1970-01-01
          • 2012-05-18
          • 2015-02-09
          • 1970-01-01
          • 2016-01-27
          相关资源
          最近更新 更多