使用导航控制器时如何跳过2个视图

 智亚康-Scorpio 发布于 2023-01-29 16:18

在Xcode 5.0.2中,我创建了一个iPhone应用程序(完整的应用程序代码在GitHub上,请运行pod install一次 - for SDWebImage),它显示社交网络列表(Facebook,Google +等),然后 - 在另一个视图中 -一个UIWebView显示的OAuth2网页,然后用头像和细节(姓,名等)第三种观点:

Xcode截图

(这里是上面显示的故事板的全屏截图)

在此输入图像描述

在我在上一个视图中显示用户头像和详细信息之前,我将用户数据保存到NSUserDefaults.

我的问题是:当用户下次启动应用程序并且NSUserDefaults已经存在用户数据时- 如何跳过前2个视图并显示(没有任何动画)具有这些用户详细信息的最后一个视图?

我将以下代码放到AppDelegate.m中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *key = [defaults objectForKey:@"key"];
    User *user = [User loadForKey:key];

    if (user) {
        UINavigationController *nc = (UINavigationController*)self.window.rootViewController;
        // XXX how to load the last view here? XXX
    }

    return YES;
}

并且可以看到,用户数据正在加载好,但我不明白如何跳转到最后一个视图(特别是因为大多数UI都是在故事板中定义的)?

更新:我尝试使用AppDelegate.m中的以下代码(并将DetailsStoryboardID 分配给最后一个视图)来关注Tommy Alexander的建议(谢谢!):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *key = [defaults objectForKey:@"key"];
    User *user = [User loadForKey:key];

    if (user) {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        UIViewController *uvc = [storyboard instantiateViewControllerWithIdentifier:@"Details"];
        NSLog(@"XXX uvc=%@ user=%@", uvc, user);
        [self.window.rootViewController presentViewController:uvc animated:YES completion:nil];
    }

    return YES;
}

虽然最后一个视图(具有用户头像和详细信息的UserViewController)似乎可以实例化,但是我得到以下警告并且应用程序没有跳转到最后一个视图:

MyAuth[3917:70b] XXX uvc= user=
VK
59751265
Alexander
Farber
1945522
http://cs319319.vk.me/v319319265/b7df/TnyKeffL_mU.jpg
0
MyAuth[3917:70b] Warning: Attempt to present  on  whose view is not in the window hierarchy!

更新2:当我将上面的代码移动到viewDidLoad第一个视图(MasterViewController.m,用户可以选择社交网络)时,我得到另一个警告:

MyAuth[1358:70b] XXX uvc= user=
FB
597287941
Alexander
Farber
Bochum, Germany
http://graph.facebook.com/597287941/picture?type=large
0
MyAuth[1358:70b] Unbalanced calls to begin/end appearance transitions for .

更新3:感谢您的宝贵答案!我最终使用了Leonty Deriglazov的建议:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *vc1 = [storyboard instantiateViewControllerWithIdentifier:@"Master"];
    //UIViewController *vc2 = [storyboard instantiateViewControllerWithIdentifier:@"Login"];
    UIViewController *vc3 = [storyboard instantiateViewControllerWithIdentifier:@"User"];

    User *user = [User load];
    NSArray *controllers = (user ? @[vc1, vc3] : @[vc1]);

    UINavigationController *nc = (UINavigationController *)self.window.rootViewController;
    [nc setViewControllers:controllers];

    return YES;
}

Leon Derigla.. 14

简而言之,最直接的解决方案是使用-[UINavigationController setViewControllers:animated:].

您需要执行以下操作才能实现您的目标:

    为所有控制器分配故事板ID,

    从故事板中实例化所有三个视图控制器(只要你不在控制器的构造函数中完成大部分初始化工作,这是轻量级的)

    按照故事板中的顺序将它们放入数组中,

    调用-[UINavigationController setViewControllers:]与阵列作为第一个参数.

而已.您-[AppDelegate application:didFinishLaunchingWithOptions:]可能看起来像这样(在检查您的跳过条件后):

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc1 = [storyboard instantiateViewControllerWithIdentifier:@"MyAuth"]; //if you assigned this ID is storyboard
UIViewController *vc2 = [storyboard instantiateViewControllerWithIdentifier:@"Login"];  //if you assigned this ID is storyboard
UIViewController *vc3 = [storyboard instantiateViewControllerWithIdentifier:@"Details"];
NSArray *controllers = @[vc1, vc2, vc3];
UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
[navController setViewControllers:controllers];

如果你只是粘贴它-[AppDelegate application:didFinishLaunchingWithOptions:],你会发现它立即起作用.

1 个回答
  • 简而言之,最直接的解决方案是使用-[UINavigationController setViewControllers:animated:].

    您需要执行以下操作才能实现您的目标:

      为所有控制器分配故事板ID,

      从故事板中实例化所有三个视图控制器(只要你不在控制器的构造函数中完成大部分初始化工作,这是轻量级的)

      按照故事板中的顺序将它们放入数组中,

      调用-[UINavigationController setViewControllers:]与阵列作为第一个参数.

    而已.您-[AppDelegate application:didFinishLaunchingWithOptions:]可能看起来像这样(在检查您的跳过条件后):

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *vc1 = [storyboard instantiateViewControllerWithIdentifier:@"MyAuth"]; //if you assigned this ID is storyboard
    UIViewController *vc2 = [storyboard instantiateViewControllerWithIdentifier:@"Login"];  //if you assigned this ID is storyboard
    UIViewController *vc3 = [storyboard instantiateViewControllerWithIdentifier:@"Details"];
    NSArray *controllers = @[vc1, vc2, vc3];
    UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
    [navController setViewControllers:controllers];
    

    如果你只是粘贴它-[AppDelegate application:didFinishLaunchingWithOptions:],你会发现它立即起作用.

    2023-01-29 16:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有