首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在AppDelegate中确定rootView

如何在AppDelegate中确定rootView
EN

Stack Overflow用户
提问于 2012-11-29 13:08:31
回答 6查看 1.5K关注 0票数 2

我正在学习iOS并开发我的第一个iPone应用程序。我想给我的应用程序添加一个功能:如果用户以前登录过,我想将用户重定向到主视图。否则,我想将用户重定向到登录视图。

我读过ios change storyboard default view controller at run time,但我想知道我是否可以用AppDelegate编写决定根视图的代码。因此,我不会有一个永远不会推出的视图。

这是我在AppDelegate中的代码:

代码语言:javascript
复制
- (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的新手。我希望这个问题不是愚蠢的。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-11-30 14:51:05

我终于在Conditionally start at different places in storyboard from AppDelegate的@followben中找到了我想要的答案。这是他的示例代码:

代码语言:javascript
复制
- (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斜杠加了+1,因为你的讨论很有启发性。由衷地感谢你们。

票数 3
EN

Stack Overflow用户

发布于 2012-11-29 13:19:16

我会尝试将您想要显示的视图控制器的整个初始化放入if-else语句中。您将rootVC设置为MainViewController类型,然后如果用户尚未登录,则尝试将rootVC更改为LoginViewController类型

例如

代码语言:javascript
复制
id rootVC = nil;    
if (userNeverLogin) {
   rootVC = [[LoginViewController alloc] init];
} else {
   rootVC = [[MainViewController alloc] init];
}

self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootVC];

不显示的视图的更新

如果您还没有创建使用nib名称初始化视图控制器的方法(其他人建议您这样做),那么还有另一种解决方法。单击您的MainViewController.xib,然后在界面生成器中单击File Owner。单击实用工具侧栏(屏幕右侧)中左起的第三个图标Identity Inspector,并将自定义类更改为MainViewController。对你的LoginViewController.xib做同样的事情

票数 3
EN

Stack Overflow用户

发布于 2012-11-29 13:30:46

在代码中,

代码语言:javascript
复制
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仅用于if块作用域,因此请执行如下操作

代码语言:javascript
复制
id rootViewController = nil;
if (userNeverLogin)
{
    rootViewController = [[LoginViewController alloc] init];
}
else
{
    rootViewController = [[MainViewController alloc] init];
}
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13619221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档