Ios 从应用程序委派跳过视图
我的iOS应用程序有问题。一旦用户登录,我想直接将其引导到我的MainViewController,而不是LoginViewController 当我以下面的方式执行此操作时,我在模拟器中得到一个空视图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
- (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