【问题标题】:Loading ViewControllers within Storyboard在 Storyboard 中加载 ViewController
【发布时间】:2013-04-08 03:36:18
【问题描述】:

我正在使用侧视图控制器设置: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 *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];
}

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

【问题讨论】:

    标签: ios ios5 uiviewcontroller storyboard uistoryboard


    【解决方案1】:

    就我个人而言,我喜欢从一开始就将主屏幕设置为根视图控制器,并让viewDidAppear 通过非动画模式 segue 自动将我带到登录屏幕(我更喜欢 performSegueWithIdentifier 以便故事板的 segues 显示了整个流程,而不是手动实例化控制器并调用 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];
    }
    

    【讨论】:

    • 很好的答案,在我尝试实施之前。你能确认他们我可以为登录建模显示导航控制器吗?我以为我只能模态一个控制器。如果是这种情况,我有三个用于登录的控制器,因此我需要对每个控制器进行模态化并根据需要关闭。
    • @StuartM - 是的,您可以从家到导航控制器进行模态转场,将转场从欢迎推送到登录到注册,然后“关闭”返回主屏幕。上面的故事板和代码来自工作演示。
    • 谢谢@Rob 我从您的回答中发现了这一点,这很棒。我实际上能够包含我的 initialviewcontroller 类并简单地访问 self.slidingviewcontroller.topviewcontroller 然后像往常一样实例化ViewControllerWithIdentifier。您是否知道这是否可以处理不再需要从情节提要中释放旧视图?
    • @StuartM - 使用我的技术,而不是使用顶部控制器,而是从真正的“主”屏幕开始,模态到欢迎/登录/注册系列,然后关闭,是的它们被正确释放。我通过在每个只执行NSLog(@"%s", __FUNCTION__); 的控制器上添加dealloc 来确认这一点。您应该这样做并确认他们正在为您释放。
    • 看起来我的控制器也正在通过我的路由进行释放,这很棒,感谢您花时间研究 dealloc 方法,非常有用。
    【解决方案2】:

    在 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多