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

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

下面是我的应用程序: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委托。

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


当前回答

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

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

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

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

其他回答

我从“空应用程序”模板开始,然后手动添加XIB时得到了这个。我通过设置Sunny建议的主Nib名称来解决这个问题。这个场景中缺少的步骤是删除

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

from

application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

因为它会覆盖在Xib文件中创建的窗口实例。这是假设你已经创建了一个ViewController,并将它与XIB文件中的窗口和App Delegate连接起来。

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

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

验证你的STORYBOARD文件…如果你使用IB '电线'代码到你的UI..然后刚好删除了UI元素…然后意识到,哦,你需要删除代码中的引用(在我的情况下,一个名为AbortButton的UIButton)…然后过了一会儿,应用程序就不会启动了……

问题在“故事板”文件中。在xml编辑器中打开它,寻找孤立的“关系”,这些连接器指向不应该指向的地方……

eg:

<relationships> <关系种类=“出口” 名称=“中止按钮” 候选类=“UIButton”/>

在我的代码中已经不存在了…(然而我仍然有一个“连接器”链接在故事板文件)..

此外,我有(莫名其妙和无效的连接器从一个UIImageView或工具栏到我的主UIViewController。视图对象)…我想它也不喜欢……

底线-一个人不需要手动“编码控制器”的存在…STORYBOARD文件被破坏了。我修好了我的,宾果又完美地工作了。

顺便说一句,作为一个文本编码员。我越来越喜欢IB…踢屁股在MS Visual Studio的IDE…

我也有同样的问题。如果你像我一样“从零开始”构建一个基于窗口的应用程序,你需要做以下工作:(注意,这些是Xcode 4.2的步骤。)

0. 确保你的应用委托符合UIApplicationDelegate协议。

例如,假设我们的委托名为MyAppDelegate。在MyAppDelegate.h中,我们应该有这样的东西:

@interface MyAppDelegate : 
    NSObject <UIApplicationDelegate> // etc...

1. 在main.m中指定应用程序委托

例如,

#import "MyAppDelegate.h"

int main(int argc, char *argv[])
{
  @autoreleasepool {
    return UIApplicationMain(argc, argv,
      nil, NSStringFromClass([MyAppDelegate class]));
  }
}

2. 创建一个主窗口界面文件。

为此,右键单击项目并选择新建文件。从那里,选择窗口从iOS ->用户界面部分。

将文件添加到项目后,转到项目的摘要(左键单击项目;点击总结。)在iPhone/iPod部署信息下(如果你喜欢的话,还有相应的iPad部分),在“主界面”组合框中选择你的新界面文件。

3.在接口编辑器中将它们全部连接起来

在文件列表中选择接口文件以调出接口编辑器。

确保Utilities窗格是打开的。

通过从“实用工具”窗格中的“对象”列表中拖动一个对象到窗口对象的上方或下方的空间中添加一个新对象。选择对象。单击Utilities窗格中的Identity检查器。将Class更改为应用程序的委托(本例中为MyAppDelegate)。

调出MyAppDelegate的连接检查器。将窗口出口连接到接口文件中已经存在的窗口。

单击左边的File's Owner,然后单击Utilities窗格中的Identity检查器。将类更改为UIApplication

为File's Owner调出连接检查器。将委托出口连接到MyAppDelegate对象。

4. 最后,也是非常重要的一点,单击接口文件中的Window对象。打开Attributes检查器。确保选中“发射时可见”。

这就是我要让它为我工作所做的一切。好运!

当没有正确设置接口生成器时,会发生此问题。

确保你的App Delegate的窗口和viewController outlet被连接起来:

在你的主窗口。xib,按住control,点击App Delegate并拖动到Window对象。选择窗口。按住control并再次选择App委托,拖到你的根视图控制器并选择viewController。