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

Art*_*sev 380 objective-c ios

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

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

以下是我的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;
}
Run Code Online (Sandbox Code Playgroud)

在Interface Builder中,UITabBarController代理连接到App Delegate.

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

Ord*_*Dei 434

在AppDelegate中替换

 [window addSubview:[someController view]];
Run Code Online (Sandbox Code Playgroud)

  [self.window setRootViewController:someController];
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在使用UINavigationController,首先应该[[UINavigationController] initWithRootViewController:tableViewController],然后使用上面的代码[self.window setRootViewController:self.navigationController]来设置窗口的根视图控制器 (3认同)

sho*_*sho 188

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

retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
Run Code Online (Sandbox Code Playgroud)

  • 另一个选择是确保在main中导入app delegate类并使用`NSStringFromClass`.这就是Xcode现在创建main.m文件的方式.例如:`#import"AppDelegate.h`然后`int retVal = UIApplicationMain(argc,argv,nil,NSStringFromClass([AppDelegate class]));` (49认同)
  • 确保`self.window`初始化为`self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];` (10认同)
  • 对我没有任何影响,在进行更改后,同样的"应用程序是预期的......"消息.解决方案是OrdoDei的答案(见上文或下文)完美无缺. (3认同)
  • 如果您在模拟器中看到一个白色视图,但希望看到故事板中的布局,请确保您删除了根委托函数“application didFinishLaunchingWithOptions...”中的代码,该代码在 main.m 中指向并且只有“return是的;” 在里面。 (2认同)

War*_*kst 69

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

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

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

- (void)viewDidLoad

- (void)viewDidAppear:(BOOL)animated

并且错误停止显示.我的问题具体是由一个UIAlertView节目引起的.

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

祝好运!

  • 今天发现这个并且很高兴我做了 - 同样的问题 - 在viewDidLoad中展示了一个uialert的发布.更改为viewDidAppear并正常工作.通过在iOS5中更改这一点,不确定Apple取得了哪些更好的成就. (2认同)

jlu*_*jan 47

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

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
Run Code Online (Sandbox Code Playgroud)

application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Run Code Online (Sandbox Code Playgroud)

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


ari*_*dam 46

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

在此输入图像描述

  • 这对我有用!当您在Xcode 4.2中创建一个空项目时,这将起作用,其中不存在MainWindow,以及我们如何将其连接起来. (2认同)

小智 27

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


如果这不是重点,并且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;
}
Run Code Online (Sandbox Code Playgroud)

只有在实施了sho的解决方案时,这才有效.


Mik*_*ynn 24

我升级到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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • **注意**:这个答案是一种解决方法,并没有解决根本原因.请参见http://stackoverflow.com/a/33958144/1116061 (5认同)

Rye*_*AC3 21

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

加:

window.rootViewController = navigationController;
Run Code Online (Sandbox Code Playgroud)

后:

[window addSubview:navigationController.view];
Run Code Online (Sandbox Code Playgroud)

在我的appdelegate中

- (void)applicationDidFinishLaunching:(UIApplication *)application {
Run Code Online (Sandbox Code Playgroud)


bea*_*ain 20

  • 在Nib文件中选择"窗口"
  • 在"属性检查器"中选中"在启动时可见"

图片![]

  • 手动创建nib文件时会发生这种情况.
  • 此修复程序适用于常规笔尖模式 - 而非故事板模式

  • 如果手动创建窗口nib文件,并且默认情况下未选中"在启动时可见"将在应用程序启动后提示此消息,这可以解决我的问题! (3认同)

rém*_*émy 19

如何为iOS5添加RootViewController

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

rootViewController = [[RootViewController alloc] init];
window.rootViewController = rootViewController;
Run Code Online (Sandbox Code Playgroud)

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

这是一篇关于RootViewController和AppDelegate 的好文章,


ant*_*ope 11

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions {
   return YES;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 同样在这里.谢谢.如果创建空应用程序,则此方法将填充手动创建窗口.这应该改为简单地返回YES.谢谢 (2认同)

trc*_*den 11

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

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

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

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


Bru*_*Lee 11

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

//self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
Run Code Online (Sandbox Code Playgroud)

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


小智 10

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

MenuViewController *menuViewController = [[MenuViewController alloc]init];
self.window.rootViewController = menuViewController;
Run Code Online (Sandbox Code Playgroud)

在App Delegate方法上:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
}
Run Code Online (Sandbox Code Playgroud)

那很有效.


bob*_*obo 10

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
}
Run Code Online (Sandbox Code Playgroud)

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


d.l*_*dev 9

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

self.window.rootViewController = self.tabBarController;
Run Code Online (Sandbox Code Playgroud)

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


Raw*_*ean 8

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

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

在此输入图像描述


the*_*ign 8

我遇到了同样的问题,但我正在使用 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;
}
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题.


Raz*_*Raz 7

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

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

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

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

解决方案是从实现部分中完全删除loadView方法,或者通过添加[super loadView]来调用父方法.

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


jan*_*way 6

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

在应用程序中:didFinishLaunchingWithOptions:

[self performSelector:@selector(callPopUp) withObject:nil afterDelay:1.0];
Run Code Online (Sandbox Code Playgroud)

1秒钟后调用:

- (void)callPopUp
{
    // call UIAlertView
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 6

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

0.确保您的应用程序委托符合UIApplicationDelegate协议.

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

@interface MyAppDelegate : 
    NSObject <UIApplicationDelegate> // etc...
Run Code Online (Sandbox Code Playgroud)

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

例如,

#import "MyAppDelegate.h"

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

2.创建主窗口界面文件.

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

将文件添加到您的项目后,转至项目的摘要(项目左键单击;单击摘要)(如果你喜欢和相应的iPad的部分)在iPhone/iPod的部署信息和选择新的接口文件中的"主界面"组合框.

3.在界面编辑器中将其全部连接起来

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

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

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

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

单击左侧的文件所有者,然后单击"实用工具"窗格中的"标识"检查器.将班级更改为UIApplication

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

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

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


Con*_*lon 6

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

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

这似乎不会导致问题.


Pét*_*son 6

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

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

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;
}
Run Code Online (Sandbox Code Playgroud)