如何在AppDelegate中决定rootView

时间:2012-11-29 05:08:31

标签: objective-c ios

我正在学习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的新手。我希望这个问题不是愚蠢的。

6 个答案:

答案 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;
}

设置视图控制器标识符的方式:enter image description here

我给了@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];
}

}

这将解决您的问题