【问题标题】:iPhone 6.0 Simulator : Application windows are expected to have a root view controller at the end of application launchiPhone 6.0 模拟器:应用程序窗口在应用程序启动结束时应该有一个根视图控制器
【发布时间】:2012-10-04 18:23:53
【问题描述】:

当我在 iPhone 6.0 模拟器中运行我的应用程序时,它会显示

应用程序窗口应该在应用程序启动结束时有一个根视图控制器

在其他模拟器中不存在。为什么? 这个错误是什么意思?

我的应用程序的导航流程是这样的:首先我的应用程序应该显示登录屏幕。进入应用程序后,我需要显示一个带有标签栏的视图。在那个视图中会有很多按钮,当我们单击这些按钮时,它应该显示没有标签栏的相应视图控制器。这就是我将那些导航控制器添加到窗口的原因。

这是我的 didFinishLaunchingWithOptions 代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.tabBarController = [[UITabBarController alloc] init];
    self.window.rootViewController = self.tabBarController;

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor=[UIColor blackColor];

    [application setStatusBarStyle:UIStatusBarStyleBlackOpaque];

    Object1 = [[Class1 alloc] initWithNibName:@"Class1" bundle:nil];
    tempNav=[[UINavigationController alloc]initWithRootViewController:Object1];
    tempNav.navigationBar.hidden=YES;
    tempNav.view.frame  = CGRectMake(0.0f, 20.0f, 320.0f, 460.0f);
    self.window addSubview:tempNav.view]; 

    LoginObj = [[Login alloc] initWithNibName:@"Login" bundle:nil];
    navController=[[UINavigationController alloc]initWithRootViewController:LoginObj];
    navController.navigationBar.hidden=YES;
    navController.view.frame  = CGRectMake(0.0f, 20.0f, 320.0f, 460.0f);
    [self.window addSubview:navController.view];

    Obj2 = [[Class2 alloc] initWithNibName:@"Class2" bundle:nil];
    navController1=[[UINavigationController alloc]initWithRootViewController:Obj2];
    navController1.navigationBar.hidden=YES;
    navController1.view.frame  = CGRectMake(0.0f, 20.0f, 320.0f, 460.0f);
    [self.window addSubview:navController1.view];

    Obj3 = [[Class3 alloc] initWithNibName:@"Class3" bundle:nil];
    navController2=[[UINavigationController alloc]initWithRootViewController:Obj3];
    navController2.navigationBar.hidden=YES;
    navController2.view.frame  = CGRectMake(0.0f, 20.0f, 320.0f, 460.0f);
    [self.window addSubview:navController2.view];

    Obj4 = [[Class4 alloc] initWithNibName:@"Class4" bundle:nil];
    navController3=[[UINavigationController alloc]initWithRootViewController:Obj4];
    navController3.navigationBar.hidden=YES;
    navController3.view.frame  = CGRectMake(0.0f, 20.0f, 320.0f, 460.0f);
    [self.window addSubview:navController3.view];

    [self.window makeKeyAndVisible];

    return YES;  
}

【问题讨论】:

  • 能否包含您的应用程序:didFinishLaunchingWithOptions 代码。这可能就是发生这种情况的地方。
  • 这对我来说在所有模拟器上都有显示,当您将 rootViewController 的视图添加到窗口时会发生这种情况,而不是设置 rootViewController 属性

标签: iphone ios-simulator


【解决方案1】:

正如 wattson12 所说,您需要在您的应用委托中执行以下操作:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
    self.window.rootViewController = self.mainViewController;    // you need this line!
    [self.window makeKeyAndVisible];
    return YES;
}

如果您没有明确设置UIWindow rootViewController property,您将看到此消息。

如果您使用 Xcode 4.5 创建一个新项目,它应该在模板应用程序委托中包含此代码。如果您使用的是在早期版本的 Xcode 中创建的项目,则该行可能会丢失,并且您会收到警告消息。

【讨论】:

    【解决方案2】:

    这意味着您没有将您的应用设置为rootViewController。 首先从您的代码中删除这些行-

    [self.window addSubview:tempNav.view];  
    [self.window addSubview:navController.view];  
    [self.window addSubview:navController1.view];  
    [self.window addSubview:navController2.view];  
    [self.window addSubview:navController3.view];  
    

    在您的代码中,您正在使用 UITabBarController,但没有初始化其 viewController 的数组,所以这样做 -

    self.tabBarController.viewControllers = [NSArray arrayWithObjects:tempNav, navController, navController1, navController2, navController3, nil];
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    

    【讨论】:

    • 我需要这样做:首先我的应用程序应该显示登录屏幕。进入应用程序后,我需要显示一个带有标签栏的视图。在那个视图中会有很多按钮,当我们单击这些按钮时,它应该显示没有标签栏的相应视图控制器。这就是我将那些导航控制器添加到窗口的原因。
    • 是的,不要在窗口上多次添加导航控制器。如果你想用 tabbarcontroller 设置导航控制器,那么用这种方式...
    • 您在问题中哪里提到了这一点?你应该把它写在你的问题中......对于登录屏幕,让 firstView 作为你的应用程序的 rootViewController,然后在 secondView 控制器 viewDidLoad: 方法中你可以添加这个标签栏,如 [self.view addSubView:tabBarController.View];
    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多