Ios 从应用程序委派跳过视图

Ios 从应用程序委派跳过视图,ios,objective-c,xcode,appdelegate,Ios,Objective C,Xcode,Appdelegate,我的iOS应用程序有问题。一旦用户登录,我想直接将其引导到我的MainViewController,而不是LoginViewController 当我以下面的方式执行此操作时,我在模拟器中得到一个空视图 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] i

我的iOS应用程序有问题。一旦用户登录,我想直接将其引导到我的MainViewController,而不是LoginViewController

当我以下面的方式执行此操作时,我在模拟器中得到一个空视图

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    NSString *storyboardId = nil;

    if(success){
        storyboardId = @"MainView";
    } else {
        storyboardId = @"LoginView";
    }

    UIViewController *controller = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:storyboardId];
    self.window.rootViewController = controller;

    [self.window makeKeyAndVisible];
    return YES;
}

由于您alloc/init self.window,它的rootViewController属性将为nil。因此,您的InstanceViewController方法将被发送到nil。因此它返回零。然后将rootViewController设置为nil。您可以使用名为:bundle:的故事板为InstanceEviewController方法获取有效的故事板。但是,如何从应用程序代理中确定成功?为什么不在mainViewController中以模式显示登录viewController?

将代码更改为:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    NSString *storyboardId = nil;

    if(success){
        storyboardId = @"MainView";
    } else {
        storyboardId = @"LoginView";
    }
    UIStoryboard *st = [UIStoryboard storyboardWithName:@"storyboard_name" bundle: nil];

    UIViewController *controller = [st instantiateViewControllerWithIdentifier:storyboardId];
    self.window.rootViewController = controller;

    [self.window makeKeyAndVisible];
    return YES;
}

在情节提要名称处,您必须输入情节提要的名称。我猜你错的地方是self.window.rootViewController.storyboard,我认为它是空的,因为self.window刚刚被分配。

对我有效的是和的响应的组合

我将loginViewController嵌入导航控制器

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIStoryboard *storyboard = nil;

    if ( IDIOM == IPAD ) {
        storyboard = [UIStoryboard storyboardWithName:@"Main_iPad" bundle: nil];
        NSLog(@"I am an iPad");
    } else {
        storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle: nil];
        NSLog(@"I am an iPhone");
    }

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSString *username = [[NSUserDefaults standardUserDefaults] objectForKey:@"Username"];
    NSString *password = [[NSUserDefaults standardUserDefaults] objectForKey:@"Password"];
    NSString *deviceID = [[NSUserDefaults standardUserDefaults] objectForKey:@"DeviceID"];

    if(deviceID == nil){
        deviceID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
        [defaults setObject:deviceID forKey:@"DeviceID"];
    }

    NSLog(@"DeviceID: %@",deviceID);


    if((username == (id)[NSNull null] || username.length == 0 ) || (password == (id)[NSNull null] || password.length == 0 )) {
        LoginViewController *loginViewController = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
        self.window.rootViewController = loginViewController;

    } else {
        SWRevealViewController  *mainViewController= [storyboard instantiateViewControllerWithIdentifier:@"MainViewController"];
        self.window.rootViewController = mainViewController;
    }
    [defaults synchronize];

    return YES;
}

你确定你的故事板ID与你在故事板上定义的相同吗?是的,其中te image说PageViewController我有MainView我的视图都是不同的自定义类,这是个问题吗?如果成功值为否,它工作正常?我尝试了两者,我的登录视图将显示,但主视图将仅在从“登录”按钮触发的登录序列后激活。我先前在AppDelegate中根据启动会话的web服务设置了成功。在视图中以模式显示我的视图的最佳方式是什么?在MainViewController的viewDidLoad中,分配/初始化LoginViewController的实例,然后使用“presentViewController:animated:completion:”方法显示登录名。用户登录后,请使用dismissViewController:animated:completion:返回到MainViewController。我尝试了此方法,但也没有得到所需的结果。您一定是在某个时候出错了,因为我使用的是此方法,它可以工作。定义viewController类时,请确保序列图像板ID是序列图像板ID,而不是自定义类。还要确保你的故事板有一个正确的名字。无论如何,清理数据并再次运行项目,cmd+shift+k