我在控制台得到以下错误:

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

下面是我的应用程序:didFinishLaunchWithOptions方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Set Background Color/Pattern
    self.window.backgroundColor = [UIColor blackColor];
    self.tabBarController.tabBar.backgroundColor = [UIColor clearColor];
    //self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"testbg.png"]];

    // Set StatusBar Color
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent];

    // Add the tab bar controller's current view as a subview of the window
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

在Interface Builder中,UITabBarController的委托被连接到App委托。

有人知道怎么解决这个问题吗?


当前回答

我也有同样的问题。检查你的主机。最后一个参数应该设置为实现UIApplicationDelegate协议的类的名称。

retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");

其他回答

选择你的“窗口”在你的Nib文件 在“属性检查器”中选择“启动时可见”

手动创建nib文件时会发生这种情况。 这个修复工作于常规的nib模式-不是故事板模式

虽然很多答案看起来都是正确的,但没有一个能帮我解决问题。我正在尝试使用空的应用程序模板,并试图为了理解而直接加载到.xib文件(就像旧的窗口模板)。苹果似乎在运行NSLog消息。

我使用的是Xcode 4.3,似乎没有任何东西可以消除这条消息,我想知道为什么。最后,我决定在Xcode 4.5(预览版/iPhone 6.0版本)中看看会发生什么,这条消息不再存在。在移动。

在我的例子中,关于实际窗口和didFinishLaunchingWithOptions:方法的一切都很好。

我的错误是我没有意识到applicationDidBecomeActive:在启动时运行,除了应用程序在后台运行后进入前台。

因此,在applicationDidBecomeActive中:我正在操作尚未完成所有设置的视图控制器(等待不同的线程响应等)。

一旦我把这个功能移到applicationDidBecomeActive之外,错误就消失了。

在ios5.0左右有一个微小的变化,要求你有一个根视图控制器。如果您的代码基于较旧的示例代码,例如GLES2Sample,那么在这些代码示例中没有创建根视图控制器。

为了修复(例如,GLES2Sample),在applicationDidFinishLaunching中,我创建了一个根视图控制器,并将我的glView附加到它。

- (void) applicationDidFinishLaunching:(UIApplication *)application
{
  // To make the 'Application windows are expected
  // to have a root view controller
  // at the end of application launch' warning go away,
  // you should have a rootviewcontroller,
  // but this app doesn't have one at all.
  window.rootViewController = [[UIViewController alloc] init];  // MAKE ONE
  window.rootViewController.view = glView; // MUST SET THIS UP OTHERWISE
  // THE ROOTVIEWCONTROLLER SEEMS TO INTERCEPT TOUCH EVENTS
}

这使得警告消失,并没有真正影响你的应用程序。

我也有这个问题。事实证明,当我从左边的对象列表中删除应用程序委托时,我删除了应用程序委托,窗口和TabBarController的连接:)