2

我正在使用侧视图控制器设置:https ://github.com/edgecase/ECSlidingViewController

初始视图控制器使用标识符为“InitialViewController”的情节提要加载。

一旦为此加载到 viewDidLoad 中,我将使用以下命令检查用户是否已登录:

UIStoryboard *storyboard;

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
}

if (![PFUser currentUser]){
    self.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"WelcomeVC"];
} else {
    self.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeVC"];
}

根据上述,如果用户没有登录,它会加载 WelcomeVC。WelcomeVC 是一个导航控制器,其中包含 3 个 Vc。欢迎/登录/注册。

用户登录后,我需要将 topViewController(如上)更改为 HomeVC。如果可能,可以关闭名为 WelcomeVC 的导航控制器。如何更改此 topViewController 我已经尝试过,但它不起作用:

UIStoryboard *故事板;

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
}

self.EVC = [storyboard instantiateViewControllerWithIdentifier:@"InitialViewController"];
self.EVC.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeVC"];
4

2 回答 2

1

就个人而言,我喜欢从一开始就将主屏幕设置为根视图控制器,并viewDidAppear通过非动画模式转场自动将我带到登录屏幕(我更喜欢performSegueWithIdentifier故事板的转场显示整个流程,而不是手动实例化控制器并调用pushViewController,但不管对你有用)。然后,我在成功登录后,只需返回主屏幕即可。这样,我就不必更改顶级控制器。

所以我的故事板看起来像:

在此处输入图像描述

所以我的主要“家”视图控制器具有以下内容viewDidAppear

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (![[Model sharedManager] loggedIn])
        [self performSegueWithIdentifier:@"login" sender:self];
}

显然,您确定是否登录的逻辑会有所不同,但您明白了。我的登录对登录屏幕进行了模态搜索(无动画),而我恰好在一系列登录屏幕上使用了导航控制器。

然后,我的最终成功登录过程会:

- (IBAction)didTouchUpInsideDoneButton:(id)sender
{
    // ok, assuming at this point that everything has been validated and 
    // I'm ready to return, so just dismiss the navigation controller.
    // You could use unwind segue in iOS 6, as well.

    [[Model sharedManager] setLoggedIn:YES];

    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
}
于 2013-04-15T22:15:28.033 回答
0

在 application:didFinishLaunchingWithOptions: 中,我检查用户是否已经登录,如果是,我跳转到配置文件:

-(void)goToProfile {
    UIStoryboard *storyboard = self.window.rootViewController.storyboard;
    UINavigationController *rootNav = [storyboard instantiateViewControllerWithIdentifier:@"MainNavigationController"];
    if (![self.window.rootViewController isKindOfClass:[rootNav class]]) {
        self.window.rootViewController = rootNav;
    }
    else {
        [(UINavigationController *)self.window.rootViewController popToRootViewControllerAnimated:YES];
    }
}

didFinishLaunchingWithOptions 不需要任何其他内容。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if ([self isLoggedIn]) {
        [self goToProfile];
    }
    else {
        NSLog(@"Not logged in");
    }
    return YES;    
}

在我的故事板中,主分支进入注册流程,登录视图的导航控制器的故事板 ID 为 MainNavigationController。 我的故事板

于 2014-08-08T13:06:48.777 回答