2

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

在运行时阅读了 ios 更改故事板默认视图控制器,但我想知道是否可以编写决定 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 的新手。我希望这个问题不是愚蠢的。

4

6 回答 6

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。单击实用程序侧栏(屏幕右侧)左侧的第三个图标Identity Inspector,并将自定义类更改为MainViewController。为你做同样的事情LoginViewController.xib

于 2012-11-29T05:19:16.463 回答
3

我终于从 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 以供您进行鼓舞人心的讨论。真诚地感谢你们。

于 2012-11-30T06:51:05.280 回答
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 仅适用于 if 块范围,因此请执行以下操作

id rootViewController = nil;
if (userNeverLogin)
{
    rootViewController = [[LoginViewController alloc] init];
}
else
{
    rootViewController = [[MainViewController alloc] init];
}
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
于 2012-11-29T05:30:45.580 回答
0

如果您的视图从 Nib 加载,请尝试此操作。

 - (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;
    } 
于 2012-11-29T05:22:33.787 回答
0

在 App 委托中确定根视图控制器应该可以工作。

我想你缺少的是

 MainViewController *rootVC = [[MainViewController alloc] init];

尝试像这样初始化控制器

 MainViewController *rootVC = [[MainViewController alloc] initWithNibName:@"nibFileName" bundle:nil];
于 2012-11-29T07:20:46.470 回答
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];
}

}

这将解决您的问题

于 2012-11-29T07:26:17.963 回答