首页 文章

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

提问于
浏览
376

我在控制台中收到以下错误:

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

以下是我的 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 .

有谁知道如何解决这个问题?

30 回答

  • 8

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

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

    在AppDelegate中替换

    [window addSubview:[someController view]];
    

    [self.window setRootViewController:someController];
    
  • 6

    尝试更改加载的第一个视图控制器时,我遇到了同样的错误

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

    起初我并不是真的知道错误来自哪里,所以我把它缩小了,发现出了什么问题 . 事实证明,我试图在视频实际出现在屏幕之前更改视图的显示 . 因此解决方案是在viewcontroller中移动此代码,这给我带来了麻烦

    - (void)viewDidLoad

    - (void)viewDidAppear:(BOOL)animated

    并且错误停止显示 . 我的问题具体是由于制作了一个 UIAlertView 节目 .

    在你的情况下,我建议你查看tabBarController的活动视图控制器中的代码(因为它可能是该视图控制器中的一个问题) . 如果这不起作用,请尝试在nib文件中而不是在代码中设置起始设置 - 或者如果要在代码中执行此操作,请尝试将代码移动到tabBarController的活动viewcontroller的相应方法 .

    祝好运!

  • 21

    这发生在我身上 . 通过编辑.plist文件解决 . 指定主nib文件基名 . (应为MainWindow.xib) . 希望这会有所帮助 .

    enter image description here

  • 4

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

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

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

    因为它将覆盖在Xib文件中创建的窗口实例 . 这假设您已经创建了一个ViewController并将其与您的窗口和App Delegate连接在XIB文件中 .

  • 10

    最近,当使用ios5 sdk构建项目时,我遇到了同样的问题 . 起初它正在构建并正常运行,但在此之后出现了错误 .
    就我而言,解决方案相当简单 .
    遗漏的是,我的应用程序目标的摘要选项卡中的 Main Interface 属性被删除了 . 所以我需要再次设置它 .

    如果这不是重点,并且tabBarController仍然是nil,则可以始终以编程方式创建窗口和根控制器 . 作为后备,我将以下代码添加到我的项目中

    - (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的解决方案时,这才有效 .

  • 5

    我升级到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;
        }
    }
    
  • 6

    上述建议都没有解决我的问题 . 我是这样的:

    加:

    window.rootViewController = navigationController;
    

    后:

    [window addSubview:navigationController.view];
    

    在我的appdelegate中

    - (void)applicationDidFinishLaunching:(UIApplication *)application {
    
  • 24
    • 在Nib文件中选择"Window"

    • 在"Attributes Inspector"检查"Visible at Launch"

    image

    • 手动创建nib文件时会发生这种情况 .

    • 此修复程序适用于常规笔尖模式 - 而非故事板模式

  • 4

    how to add a RootViewController for iOS5

    如果您的应用程序到目前为止没有使用RootViewController,只需按“文件”>“新建”>“新建文件”创建一个;);选择 UIViewController subclass 将其命名为RootViewController,取消选中With XIB for user interface(假设您已有)并将此代码放入AppDelegate :: didFinishLaunchingWithOptions

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

    当然 - 你必须导入RootViewController.h并创建变量

    here is a nice article关于RootViewController和AppDelegate,

  • 9

    我也有这个错误,但不同于之前列出的任何答案我的是因为我在我新生成的控制器(xcode 4.2,ios5)中取消注释了方法'loadView' .

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

    它甚至告诉我该方法是以编程方式创建视图但我错过了它,因为它看起来与其他方法如viewDidLoad非常相似,我通常使用我没有 grab 它 .

    如果您不是以编程方式创建视图层次结构(即使用nib或storyboard),则只需删除该方法 .

  • 69

    我也遇到了这个问题 . 我让我的项目在xcode4.2.1中运行 . 我已经阅读了那里的所有评论,但没有人对我很酷 . 过了一会儿,我发现我评论了一段代码 .

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

    然后我取消评论它 . 一切都对我好 . 希望这对你们有帮助 .

  • 188

    确保在应用程序委托中具有此功能 .

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

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

  • 3

    iOS 5.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
    }
    

    这会使警告消失,并且不会影响您的应用程序 .

  • 27

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

    self.window.rootViewController = self.tabBarController;
    

    但实际上我之前没有见过这样的错误 .

  • 11

    我的第一个观点是 MenuViewController 我添加了:

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

    在App Delegate方法上:

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

    那很有效 .

  • 3

    我通过执行以下操作解决了这个问题(以上其他解决方案都没有帮助):

    从与“主界面”关联的下拉菜单中选择另一个条目,然后重新选择“MainWindow”,然后重建 .

    enter image description here

  • 4

    我遇到了同样的问题,但我正在使用 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;
    }
    

    这解决了这个问题 .

  • 46

    我在升级到Xcode 4.3后立即开始遇到同样的问题,并且只在从头开始创建一个项目时(即创建一个空项目,然后创建一个UIViewController,然后创建一个单独的nib文件) .

    放完我以前的所有行,并确保我有正确的连接,我不断收到该错误,我试图通过视图控制器(设置为rootController)加载的nib文件从未在模拟器中显示 .

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

    Xcode 4.3似乎默认添加方法 - (void)loadView;到视图控制器实现部分 . 仔细阅读其中的评论后,问题就变得清晰了 . 如果以编程方式创建视图(并且我正在解释),则注释指示覆盖loadView方法,否则如果使用nib则不覆盖loadView . 这个方法里面没有别的东西,所以在影响中我覆盖了方法(并且什么也不做)尽管使用了一个nib文件,它给出了错误 .

    The SOLUTION was to either completely remove the loadView method from the implementation section, or to call the parent method by adding [super loadView].

    删除它最好是使用NIB文件,因为添加任何其他代码实际上会覆盖它 .

  • 9

    我在日志中有相同的错误消息 . 我在应用程序中弹出了UIAlertView:didFinishLaunchingWithOptions . 我通过延迟对alertView的调用来解决它,以便让根视图控制器有时间完成加载 .

    在应用程序中:didFinishLaunchingWithOptions:

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

    1秒钟后调用:

    - (void)callPopUp
    {
        // call UIAlertView
    }
    
  • 11

    我有同样的问题 . 如果您像我一样“从头开始”构建基于窗口的应用程序,则需要执行以下操作:(注意,这些是Xcode 4.2的步骤 . )

    0. Make sure your application delegate conforms to the UIApplicationDelegate protocol.

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

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

    1. Specify the application delegate in main.m

    例如,

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

    2. Create a main window interface file.

    为此,请右键单击项目,然后选择“新建文件” . 从那里,从iOS - >用户界面部分选择窗口 .

    将文件添加到项目后,转到项目摘要(左键单击项目;单击摘要 . )在iPhone / iPod部署信息下(如果您愿意,还可以选择相应的iPad部分)并在“”中选择新的接口文件主界面“组合框 .

    3. Hook it all up in the interface editor

    在文件列表中选择您的接口文件以显示界面编辑器 .

    确保“实用工具”窗格已打开 .

    通过将“实用程序”窗格中“对象”列表中的“对象”拖动到Window对象下方的空白区域,添加新对象 . 选择对象 . 单击“实用工具”窗格中的“标识”检查器 . 将Class更改为应用程序的委托(在此示例中为MyAppDelegate . )

    打开MyAppDelegate的连接检查器 . 将窗口连接到接口文件中已存在的窗口 .

    单击左侧的“文件所有者”,然后单击“实用程序”中的“标识”检查器窗格 . 将 class 更改为 UIApplication

    打开文件所有者的连接检查器 . 将代理插座连接到MyAppDelegate对象 .

    4. Finally, and very importantly, click on the Window object in the interface file. Open the Attributes inspector. Make sure "Visible at Launch" is checked.

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

  • 20

    如果您使用MTStatusBarOverlay,那么您将收到此错误 .

    MTStatusBarOverlay创建一个没有根控制器的附加窗口([[UIApplication sharedApplication]窗口) .

    这似乎不会导致问题 .

  • 45

    使用XCode 4.6.3和iOS 6.1将故事板替换为UI后收到相同的错误

    通过清除AppDelegate中didFinishLaucnhingWithOptions的所有代码解决了这个问题

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

    OrdoDei给出了正确而有 Value 的答案 . 我添加这个答案只是为了给出一个 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;
    }
    
  • 11

    这发生在我身上,因为我无意中评论说:

    [self.window makeKeyAndVisible];
    

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

    我能够在xcode的摘要屏幕上设置初始视图控制器 .

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

  • 18

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

    我最近改变了我的应用程序的'模型',使用MainWindow.xib以编程方式构建窗口 . 该应用程序使用较旧的模板自动创建MainWindow . 由于我想支持iPhone 5的不同控制器视图XIB,因此在创建App Delegate时以编程方式选择正确的XIB更容易 . 我也从项目中删除了MainWindow.xib .

    问题是,我忘了填写UIApplication main中的第四个参数,我忘记从项目摘要中的“主界面”中删除MainWindow .

    这引起了一个大问题:它在开发设备上呈现了无害的警告“应用程序应该......”,但是当它进入App Store时,它在用户手机上崩溃,因为MainWindow不再在捆绑中而崩溃!我不得不要求加快对错误修复的审查 .

    另一个问题是,当设置被更改并且应用程序被置于前台时,有时会出现像空白UIView一样的白色块 . 在iPhone 5中很明显它是一个320x480块 . 也许缺少的MainWindow是在开发模式下使用旧的大小创建的 . 当崩溃的第一个报告到达收件箱时,我刚刚发现了这个错误 .

    从App Store而不是从XCode安装应用程序表明该应用程序确实崩溃,并且MainWindow问题在日志中显示出来,因此我可以看到它不是IOS版本的某些特殊设备组合 .

  • 6

    要添加到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;
        }
    }
    
  • 7

    如果没有正确设置Interface Builder,就会出现此问题 .

    确保您的App Delegate的窗口和viewController插座连接起来:

    在MainWindow.xib中,按住control,单击App Delegate并拖动到Window对象 . 选择窗口 . 保持控制并再次选择App委托,拖动到根视图控制器并选择viewController .

  • 8

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

    文件的所有者是UIApplication

    • 插入对象委托类的对象,窗口连接到窗口

相关问题