我正在学习iOS并开发我的第一个iPone应用程序。我想为我的应用添加一项功能:如果用户之前已登录过,我想将用户重定向到主视图。否则,我想将用户重定向到登录视图。
我已阅读ios change storyboard default view controller at run time,但我想知道是否可以编写决定AppDelegate中根视图的代码。因此,我不会有一个从未发布的视图。
这是我在AppDelegate中的代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
MainViewController *rootVC = [[MainViewController alloc] init];
if (userNeverLogin) {
LoginViewController *rootVC = [[LoginViewController alloc] init];
}
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootVC];
return YES;
}
此代码不起作用(它不会触发任何错误,但它将在模拟器中不显示任何内容)。我应该怎么修改呢?或者在AppDelegate中无法执行此功能?
我很抱歉我是iOS的新手。我希望这个问题不是愚蠢的。
答案 0 :(得分:3)
我会尝试将您想要显示的视图控制器的整个初始化放入if-else语句中。您设置rootVC
以键入MainViewController
,然后如果用户尚未登录,则尝试将rootVC
更改为键入LoginViewController
例如
id rootVC = nil;
if (userNeverLogin) {
rootVC = [[LoginViewController alloc] init];
} else {
rootVC = [[MainViewController alloc] init];
}
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootVC];
视图未显示更新
如果您尚未创建使用nib名称初始化视图控制器的方法(其他人建议您这样做),则还有另一种解决方法。单击MainViewController.xib
,然后在Interface Builder中单击File Owner
。单击实用程序侧栏(屏幕右侧)左侧的第3个图标Identity Inspector
,然后将自定义类更改为MainViewController
。为LoginViewController.xib
答案 1 :(得分:3)
我终于发现Conditionally start at different places in storyboard from AppDelegate中来自@followben的答案实际上是我想要的答案。 这是他的示例代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
BOOL isLoggedIn = ...; // from your server response
NSString *segueId = isLoggedIn ? @"MainIdentifier" : @"LoginIdentifier";
self.window.rootViewController = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:segueId];
return YES;
}
设置视图控制器标识符的方式:
我给了@ekims和@X Slash一个+1来鼓舞人心的讨论。 真诚地谢谢你们。
答案 2 :(得分:2)
在您的代码中,
MainViewController *rootVC = [[MainViewController alloc] init];
if (userNeverLogin)
{
LoginViewController *rootVC = [[LoginViewController alloc] init];
}
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootVC];
rootVc将始终是MainViewController,因为如果userNeverLogin为true,则if块中的rootVC仅用于块范围,所以执行类似
的操作id rootViewController = nil;
if (userNeverLogin)
{
rootViewController = [[LoginViewController alloc] init];
}
else
{
rootViewController = [[MainViewController alloc] init];
}
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
答案 3 :(得分:0)
如果从Nib加载View,请尝试此操作。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
if (userNeverLogin) {
LoginViewController *rootVC = [[LoginViewController alloc] nitwithNibName:@"LoginViewController" Bundle:nil];
}
else
MainViewController *rootVC = [[MainViewController alloc] initwithNibName:@"MainViewController" Bundle:nil];
UINavigationcontroller *nvc= = [[UINavigationController alloc] initWithRootViewController:rootVC];
self.window.rootViewController=nvc;
return YES;
}
答案 4 :(得分:0)
确定App委托中的根视图控制器应该可以正常工作。
我认为你遗失的是
MainViewController *rootVC = [[MainViewController alloc] init];
尝试像这样初始化控制器
MainViewController *rootVC = [[MainViewController alloc] initWithNibName:@"nibFileName" bundle:nil];
答案 5 :(得分:0)
Follow this Steps:
1>keep your LoginView as a rootView
2>In View viewDidAppear of LoginView check this
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
if ([User isLogin] == YES) {
MainViewController *viewC = [[MainViewController alloc] initWithNibName:@"EditStoreViewController" bundle:nil];
[self.navigationController pushViewController:viewC animated:YES];
}
}
这将解决您的问题