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

我的控制台中出现以下错误:

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

下面是我的application: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 Delegate。

任何人都知道如何解决这个问题?

我有这个相同的问题。 检查你的main.m. 最后一个参数应该设置为实现UIApplicationDelegate协议的类的名称。

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

replaceAppDelegate

  [window addSubview:[someController view]]; 

  [self.window setRootViewController:someController]; 

尝试更改加载的第一个视图控制器时出现同样的错误

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

起初我并不知道这个错误是从哪里来的,所以我把它缩小了,发现出了什么问题。 事实certificate,我试图在屏幕实际出现之前改变视图的显示。 因此,解决scheme是在ViewController中移动这个代码,这给我带来了麻烦

- (void)viewDidLoad

- (void)viewDidAppear:(BOOL)animated

并且错误不再出现。 我的问题具体是由UIAlertView显示引起的。

在你的情况下,我build议你检查tabBarController的活动视图控制器中的代码(因为它可能是在视图控制器中的问题)。 如果这不起作用,请尝试在nib文件中而不是在代码中设置开始设置,或者如果要在代码中执行,请尝试将代码移到tabBarController的活动viewcontroller的适当方法。

祝你好运!

这发生在我身上。 通过编辑.plist文件解决。 指定主要的笔尖文件基本名称(应该是MainWindow.xib)。 希望这会有所帮助。

在这里输入图像描述

我从“空应用程序”模板开始,然后手动添加XIB时得到了这个。 我通过设置Sunnybuild议的主要Nib名称来解决这个问题。 在这种情况下缺less的步骤是删除

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

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

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

我最近遇到了同样的问题,在用ios5 sdk构build项目的时候。 起初它正在build设和运行正常,但之后出现了错误。
就我而言,解决scheme相当简单。
缺less的是,我的应用程序目标的摘要选项卡中的主界面属性以某种方式被擦除。 所以我需要重新设置。

如果这不是重点,并且如果tabBarController仍然是零,您可以随时以编程方式创build您的窗口和根控制器。 作为后备,我将下面的代码添加到我的项目中

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (!window && !navigationController) { NSLog(@"Window and navigation controller not loaded from nib. Will be created programatically."); self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; UIViewController *viewController1, *viewController2; viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:nil] autorelease]; viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:nil] autorelease]; self.tabBarController = [[[UITabBarController alloc] init] autorelease]; self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil]; self.window.rootViewController = self.tabBarController; } else { [window addSubview:[tabBarController view]]; } [self.window makeKeyAndVisible]; return YES; } 

这只有在sho的解决scheme也被执行的情况下才有效。

我升级到iOS9,并开始从这个地方得到这个错误。 我能够解决它,但添加下面的代码- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

 NSArray *windows = [[UIApplication sharedApplication] windows]; for(UIWindow *window in windows) { if(window.rootViewController == nil){ UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil]; window.rootViewController = vc; } } 

上述build议都不能解决我的问题。 我是这样的:

加:

 window.rootViewController = navigationController; 

后:

 [window addSubview:navigationController.view]; 

在我的appdelegate的

 - (void)applicationDidFinishLaunching:(UIApplication *)application { 
  • 在你的Nib文件中select你的“窗口”
  • 在“属性检查器”中检查“启动时可见”

图片![]

  • 当您的nib文件是手动创build时,会发生这种情况。
  • 此修正适用于常规笔尖模式 – 不是情节串联模式

如何为iOS5添加一个RootViewController

如果你的应用程序到目前为止还没有使用RootViewController,只需创build一个;)通过点击File> New> New File; selectUIViewController subclass名称为RootViewController ,取消选中With XIB for user interface(假设你已经有了),并将这段代码放到你的AppDelegate :: didFinishLaunchingWithOptions

 rootViewController = [[RootViewController alloc] init]; window.rootViewController = rootViewController; 

当然 – 你必须导入RootViewController.h并创buildvariables

这里是关于RootViewController和AppDelegate的一篇不错的文章 ,

我也有这个错误,但不像以前列出的任何答案我的是因为我已经在我新生成的控制器(xcode 4.2,ios5)取消注释的方法'loadView'。

  //Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } 

它甚至告诉我,该方法是以编程方式创build视图,但我错过了,因为它看起来很像其他方法,如viewDidLoad,我通常使用我没有抓住它。

要解决这个问题,如果你不是以编程的方式创build视图层次结构,也就是使用nib或storyboard,就可以简单地移除该方法

我也有这个问题。 我有我的项目运行在xcode4.2.1。 我已经阅读了所有的评论,但没有人对我很酷。 过了一段时间,我发现我评论了一段代码。

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

然后我取消了评论。 一切都对我好。 希望这会对你们有所帮助。

确保你的应用程序委托中有这个function。

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { return YES; } 

确保didFinishLaunchingWithOptions返回YES。 如果您碰巧删除了“返回YES”行,则会导致错误。 这个错误可能是故事板用户特别常见的。

尝试将标签栏控制器的IBOutlet连接到Interface Builder中的根视图,而不是

 self.window.rootViewController = self.tabBarController; 

但实际上我从来没有见过这样的错误。

iOS 5.0左右发生了一些变化,需要你有一个根视图控制器。 如果您的代码基于较旧的示例代码(如GLES2Sample) ,则在这些代码示例中不会创build根视图控制器。

为了修复(例如GLES2Sample),在applicationDidFinishLaunching ,我创build了一个根视图控制器并将我的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 } 

这会使警告消失,否则不会影响您的应用程序。

与我的第一个看法是MenuViewController我补充说:

 MenuViewController *menuViewController = [[MenuViewController alloc]init]; self.window.rootViewController = menuViewController; 

在应用程序委托方法:

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

这工作。

我通过下面的方法解决了这个问题(上面的其他解决scheme都没有帮助):

从与“Main Interface”相关的下拉菜单中select另一个条目,然后重新select“MainWindow”,然后重新生成。

在这里输入图像描述

我遇到了同样的问题,但我正在使用storyboard

分配我的storyboard InitialViewController到我的窗口的rootViewController

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ ... UIStoryboard *stb = [UIStoryboard storyboardWithName:@"myStoryboard" bundle:nil]; self.window.rootViewController = [stb instantiateInitialViewController]; return YES; } 

这解决了这个问题。

在升级到Xcode 4.3之后,我开始有了这个相同的问题,只有从头开始一个项目(即创build空项目,然后创build一个UIViewController,然后创build一个单独的nib文件)。

在把所有的线路都放在了我的头上,并且确保我有正确的连接之后,我不断收到错误信息,并且试图通过视图控制器(它被设置为rootController)加载的nib文件从未在模拟器中显示出来。

我通过Xcode创build了一个单一的视图模板,并将其与我的代码进行比较,最终发现问题!

Xcode 4.3似乎添加默认的方法 – (void)loadView; 到视图控制器实现部分。 仔细阅读里面的意见,就明白了问题所在。 如果以编程方式创build视图(并且我是释义),则注释将覆盖loadView方法,否则,如果使用nib,则不会覆盖loadView。 这个方法里面没有别的东西,所以在影响中,我重写了方法(并且什么都不做),而使用了一个nib文件,这给了错误。

解决scheme是要么从实现部分完全删除loadView方法,要么通过添加[super loadView]来调用父方法。

删除它将是最好的,如果使用NIB文件作为添加任何其他代码将实际上覆盖它。

我在日志中有这个相同的错误信息。 我在应用程序中popup了一个UIAlertView:didFinishLaunchingWithOptions。 我通过延迟alertView的调用来解决这个问题,以便让根视图控制器完成加载的时间。

在应用程序中:didFinishLaunchingWithOptions:

 [self performSelector:@selector(callPopUp) withObject:nil afterDelay:1.0]; 

1秒后调用:

 - (void)callPopUp { // call UIAlertView } 

我有同样的问题。 如果您是从头开始构build基于窗口的应用程序,则需要执行以下操作(请注意,这些是针对Xcode 4.2的步骤)。

确保您的应用程序委托符合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.创build一个主窗口界面文件。

为此,请右键单击您的项目并select“新build文件”。 从那里,从iOS – >用户界面部分select窗口。

将文件添加到项目后,转到项目摘要(左键单击该项目;单击摘要)。在iPhone / iPod部署信息(以及相应的iPad部分,如果您喜欢的话)下,select您的新界面文件在“主界面“combobox。

3.把它连接到界面编辑器中

在文件列表中select你的接口文件来调出接口编辑器。

确保实用程序窗格已打开。

通过将“实用工具”窗格中的“对象”列表中的对象拖动到Window对象下方的上方空间来添加新对象。 select对象。 单击“实用工具”窗格中的“标识”检查器。 将Class更改为应用程序的委托(在本例中为MyAppDelegate)。

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

点击左边的File's Owner,然后点击Utilities窗格中的Identity inspector。 将类更改为UIApplication

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

4.最后,非常重要的是,点击界面文件中的Window对象。 打开属性检查器。 确保选中“启动时可见”。

这就是我必须做的才能让它为我工作。 祝你好运!

如果你使用MTStatusBarOverlay,那么你会得到这个错误。

MTStatusBarOverlay创build一个额外的窗口([[UIApplication sharedApplication]窗口),它没有根控制器。

这似乎不会造成问题。

使用XCode 4.6.3和iOS 6.1replace我的UI后,收到同样的错误

通过清除AppDelegate中的didFinishLaucnhingWithOptions中的所有代码来解决此问题

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; } 

OrdoDei给出了一个正确和有价值的答案。 我只是添加这个答案给一个didFinishLaunchingWithOptions方法的例子,使用他的答案,以及其他人的导航控制器的意见。

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. // Instantiate the main menu view controller (UITableView with menu items). // Pass that view controller to the nav controller as the root of the nav stack. // This nav stack drives our *entire* app. UIViewController *viewController = [[XMMainMenuTableViewController alloc] init]; self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; // Instantiate the app's window. Then get the nav controller's view into that window, and onto the screen. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // [self.window addSubview:self.navigationController.view]; // The disabled line above was replaced by line below. Fixed Apple's complaint in log: Application windows are expected to have a root view controller at the end of application launch [self.window setRootViewController:self.navigationController]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; } 

这发生在我身上,因为我不经意间发表了评论:

 [self.window makeKeyAndVisible]; 

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

我能够在xcode的汇总屏幕上设置初始视图控制器。

点击左侧文件资源pipe理器中最顶端的项目名称(它应该有一个蓝图图标)。 在中间一栏中,点击'TARGETS'下的项目名称(在它旁边应该有一个小铅笔'A'图标)。 查看“iPhone / iPod部署信息”并查找“主界面”。 您应该可以从下拉菜单中select一个选项。

在“笑”回答之上,这是正确的(UIApplicationMain的第四个参数应该是主控制器的名称),我添加一些注释。

我最近改变了我的一个应用程序的“模型”使用MainWindow.xib编程构造一个窗口。 该应用程序使用了一个自动创build该MainWindow的旧模板。 由于我想支持不同的控制器视图XIB for iPhone 5,所以在App Delegate创build时更容易以编程方式select正确的XIB。 我也从项目中删除了MainWindow.xib。

问题是,我忘记填写UIApplication main中的第四个参数,并且在项目摘要中忘记了从“Main Interface”中删除MainWindow。

这导致了一个大问题:它在开发设备上提供了“应用程序预期……”的无害警告,但是当它进入App Store时,它打破了消费者电话,因为MainWindow不在捆绑中! 我不得不要求加速审查bugfix。

另一种情况是,有时候一个白色的块,像一个空白的UIView,有时出现在设置被改变,应用被放在前台。 在iPhone 5中,显然它是一个320×480的块。 也许缺less的MainWindow是使用旧的尺寸在开发模式下创build的。 当第一次崩溃报告到达收件箱时,我刚刚发现了这个错误。

从App Store而不是从XCode安装应用程序显示,应用程序确实崩溃了,MainWindow问题在日志中显示,所以我可以看到它不是设备+ IOS版本的某种特殊组合。

添加到Mike Flynn的答案,自升级到Xcode 7,并在iOS 9设备上运行我的应用程序,我添加到我的(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

 // Hide any window that isn't the main window NSArray *windows = [[UIApplication sharedApplication] windows]; for (UIWindow *window in windows) { if (window != self.window) { window.hidden = YES; } } 

当您没有正确设置Interface Builder时会发生此问题。

确保您的App Delegate的窗口和viewController插口已连接:

在你的MainWindow.xib中,按住control,点击App Delegate并拖动到Window对象。 select窗口。 保持控制并再次select应用程序委托,拖动到您的根视图控制器,并selectviewController。

当MainWindow.xib文件的所有者设置不正确时,也会出现此错误。

文件的所有者是UIApplication
– >窗口连接到窗口的应用程序委托类的插入对象