【问题标题】:how to decide rootView in AppDelegate如何在 AppDelegate 中决定 rootView
【发布时间】:2012-11-17 03:20:35
【问题描述】:

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

【问题讨论】:

  • 可以在 AppDelegate 中做到这一点
  • @Brian 你真的在使用故事板吗?
  • 是的,我正在使用情节提要。

标签: objective-c ios


【解决方案1】:

我会尝试将您想要显示的视图控制器的整个初始化放入 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,然后在界面生成器中单击File Owner。单击实用工具侧栏(屏幕右侧)左起第三个图标Identity Inspector,并将自定义类更改为MainViewController。为您的LoginViewController.xib 做同样的事情

【讨论】:

  • 一开始我的代码是这样写的,但是 XCode 会说最后一行中的“rootVC”是一个未声明的标识符。此代码无法编译。我认为 X Slash 使用的方式是正确的。不过,我也想知道为什么 XCode 在这种情况下将 rootVC 视为“未声明的标识符”。
  • X Slash 有正确的方法,编辑我的答案来纠正这个问题
  • 有什么方法可以在不使用 xib 的情况下实现我的目标?我正在使用情节提要,如果没有必要,我不想使用 xib。衷心感谢。
  • 只需打开情节提要并点击MainViewController,然后点击File Owner。之后与上面列出的步骤相同。 (Identity Inspector -> 更改自定义类)
  • 我已经找到了解决方案并自己回答了这个问题。也许你可以看看我发布的答案。我希望答案也对你有用。还是谢谢你!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在您的代码中,

    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];
    

    【讨论】:

    • 谢谢!现在我可以从 MainViewController 中的 viewDidLoad 获取 NSLog,但是,模拟器中没有出现任何内容。我应该如何解决这个问题? (模拟器屏幕截图:cl.ly/image/1A1U1y0F1p04)顺便说一句,我正在使用故事板。
    【解决方案4】:

    如果你的视图是从 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;
        } 
    

    【讨论】:

      【解决方案5】:
      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];
      }
      

      }

      这会解决你的问题

      【讨论】:

        【解决方案6】:

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

        我认为你缺少的是

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

        尝试像这样初始化控制器

         MainViewController *rootVC = [[MainViewController alloc] initWithNibName:@"nibFileName" bundle:nil];
        

        【讨论】:

          猜你喜欢
          • 2023-04-01
          • 2014-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-31
          • 1970-01-01
          相关资源
          最近更新 更多