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

时间:2011-09-22 20:21:51

标签: ios objective-c

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

  

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

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

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

50 个答案:

答案 0 :(得分:430)

在AppDelegate中替换

 [window addSubview:[someController view]];

  [self.window setRootViewController:someController];

答案 1 :(得分:188)

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

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

答案 2 :(得分:69)

尝试更改

中加载的第一个视图控制器时遇到了同样的错误

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

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

- (void)viewDidLoad

- (void)viewDidAppear:(BOOL)animated

并且错误停止显示。特别是我的问题是由UIAlertView节目引起的。

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

祝你好运!

答案 3 :(得分:46)

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

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

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

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

答案 4 :(得分:46)

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

enter image description here

答案 5 :(得分: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;
}

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

答案 6 :(得分: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;
    }
}

答案 7 :(得分:21)

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

添加:

window.rootViewController = navigationController;

后:

[window addSubview:navigationController.view];

在我的appdelegate的

- (void)applicationDidFinishLaunching:(UIApplication *)application {

答案 8 :(得分:20)

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

image![]

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

答案 9 :(得分:19)

如何为iOS5添加RootViewController

如果你的应用程序到现在为止没有使用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,

答案 10 :(得分:11)

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

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

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

答案 11 :(得分:11)

确保您在应用程序代理中具有此功能。

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

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

答案 12 :(得分:11)

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

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

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

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

答案 13 :(得分: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
}

这会使警告消失,并且不会对您的应用产生任何影响。

答案 14 :(得分:9)

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

self.window.rootViewController = self.tabBarController;

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

答案 15 :(得分:9)

我的第一个视图是MenuViewController我添加了:

MenuViewController *menuViewController = [[MenuViewController alloc]init];
self.window.rootViewController = menuViewController;
App Delegate方法上的

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

那很有效。

答案 16 :(得分:8)

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

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

enter image description here

答案 17 :(得分: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;
}

这解决了这个问题。

答案 18 :(得分:7)

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

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

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

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

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

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

答案 19 :(得分:6)

我遇到了同样的问题。如果您像我一样“从头开始”构建基于窗口的应用程序,则需要执行以下操作:(注意,这些是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中选择Window - &gt;用户界面部分。

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

第3。在界面编辑器中将其全部搞定

在文件列表中选择您的界面文件以打开界面编辑器。

确保“工具”窗格已打开。

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

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

单击左侧的“文件所有者”,然后单击“实用工具”窗格中的“身份”检查器。将班级更改为UIApplication

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

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

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

答案 20 :(得分:6)

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

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

这似乎不会引起问题。

答案 21 :(得分:6)

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

在应用程序中:didFinishLaunchingWithOptions:

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

在1秒后调用:

- (void)callPopUp
{
    // call UIAlertView
}

答案 22 :(得分:6)

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

通过清除AppDelegate中didFinishLaucnhingWithOptions的所有代码来解决它

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

答案 23 :(得分: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;
}

答案 24 :(得分:4)

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

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

答案 25 :(得分:4)

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

[self.window makeKeyAndVisible];

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

答案 26 :(得分:4)

在“笑”答案之上,这是正确的(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版本的一些特殊组合。

答案 27 :(得分:4)

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

答案 28 :(得分:3)

我收到此错误(Applications are expected to have a root view controller at the end of application launch),我正在以编程方式创建视图控制器。

通过确保我的根视图控制器中的loadView方法调用[super loadView]来解决此问题。

答案 29 :(得分:3)

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

文件的所有者是UIApplication
- &gt;插入了app delegate类的对象,窗口连接到窗口

答案 30 :(得分:3)

如果未正确设置Interface Builder,则会出现此问题。

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

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

答案 31 :(得分:1)

我也遇到了这个错误,但是已经列出的答案没有解决我的问题。 在我的情况下,日志显示是由于我在另一个子线程中分配应用程序根视图控制器。

-(BOOL) application:(UIApplication*) application didFinishLaunchingWithOptions:(NSDictionary*) launchOptions
{
    ...
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        ...
        dispatch_async(dispatch_get_main_queue(), ^{
            ...
            [self updateTabBarTitles];
            self.window.rootViewController = self.tabBarController;
            ...
        });
    });

    [self.window makeKeyAndVisible];
    return YES;
}

通过将rootViewController赋值移动到函数末尾 - 就在调用makeKeyAndVisible之前: - 导致日志消息不再显示。

{
    ...
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

我希望这会有所帮助。

答案 32 :(得分:1)

self.tabBarController回复nil的声音。 tabBarController可能未在Interface Builder中连接。将IBOutlet的{​​{1}}设置为Interface Builder中的tabBarController

答案 33 :(得分:1)

虽然很多这些答案似乎都是有效的,但没有人为我解决这个问题。我正在尝试使用空的应用程序模板并尝试直接加载到.xib文件以便了解(比如旧的窗口模板)。似乎Apple留下了运行的NSLog消息。

我在Xcode 4.3上,似乎没有任何东西摆脱这个消息,我想知道为什么。最后我决定看看在Xcode 4.5(预览/ iPhone 6.0版本)中会发生什么,并且消息不再存在。继续前进。

答案 34 :(得分:1)

我在Xcode 4.5.1中针对iOS 5.1的iPad应用程序中遇到了这个问题。该应用程序使用UITabBarController。我在标签栏控制器中需要一个新的部分,所以我创建了一个新的视图控制器和xib。一旦我将新的视图控制器添加到标签栏控制器,我的屏幕控制都不再有效,我得到了“预期有根视图控制器”的日志。

不知何故,新xib中的顶级对象是UIWindow而不是UIView。当我将UIView放入XIB时,如果视图出口指向它,将所有子视图移动到新的UIView中,并删除了UIWindow实例,问题就解决了。

答案 35 :(得分:1)

这个错误突然袭来了我。那是什么造成的呢?

事实证明我在IB中将文件所有者附加到我拖到视图上的新的小ImageView。我没有在.h文件中将其称为IBOutlet,因此当我按住Ctrl键拖动它时,新的Imageview未被列为可能的连接。小黑框中显示的唯一可能是View。我必须在不经意间点击。我做了一些更改然后运行程序并得到根控制器错误。该修复程序将文件所有者重新连接到xib-IB屏幕中的底部视图。

答案 36 :(得分:1)

确保为第一个场景正确设置了“是初始视图控制器”。enter image description here

这就是导致错误的原因。

答案 37 :(得分:0)

我在使用 CoreData 和自定义 ServiceLocator 时遇到了这样的错误

let context: NSManagedObjectContext = try self.dependencies.resolve()

//solution
let context: NSManagedObjectContext? = try? self.dependencies.resolve()

答案 38 :(得分:0)

This Swift 2 solution worked for me :

Insert the code below in AppDelegate -> didFinishLaunchingWithOptions

self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("YourRootViewController") as? YourRootViewControllerClass

答案 39 :(得分:0)

如果您的应用程序用FingerTipWindow替换主UIWindow(以显示投影仪上的触摸)并且您没有更新源几年(几年),则替换对象可能不包含rootViewController属性(请参阅kgn的5 / 21/2013 mod at GitHub

您可以在window.rootViewController中设置didFinishLaunchingWithOptions,直到奶牛回家,但您的窗口不会在应用程序启动结束时报告一个“,并且会在运行时抛出异常。更新您的来源。

答案 40 :(得分:0)

我也有这个问题。事实证明,当我从左侧的Objects列表中删除App Delegate时,我删除了App Delegate,Window和TabBarController的连接:)

答案 41 :(得分:0)

您是否尝试过设置代理,即

self.rootController.delegate = self;

在applicationDidFinishLaunchingWithOptions中?这对我有用,虽然我不确定为什么。

答案 42 :(得分:0)

setRootViewController:didFinishLaunchingWithOptions:移到awakeFromNib:解决了这个问题。

答案 43 :(得分:0)

就我而言,关于实际窗口和didFinishLaunchingWithOptions:方法的所有内容都很好。

我的错误是我在启动时没有意识到applicationDidBecomeActive:运行,此外还有应用程序在后台运行后到达前台。

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

一旦我将此功能移到applicationDidBecomeActive之外,错误便消失了。

答案 44 :(得分:0)

答案都没有解决我的问题。

我正在开发一个升级到ARC的旧iOS4项目,现在正在使用适用于iOS 7的Xcode 5

我仔细阅读了所有内容并开始检查我的配置和代码。

为我修复的是添加

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

除了

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
}

我没有

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

在收到错误之前。

答案 45 :(得分:0)

以上都没有为我工作......在我的appDelegate上发现我的init方法有问题。如果要实现init方法,请确保正确执行

我有这个:

- (id)init {
    if (!self) {
        self = [super init];
        sharedInstance = self;
    }
    return sharedInstance;
}

并将其更改为:

- (id)init {
    if (!self) {
        self = [super init];
    }
    sharedInstance = self;
    return sharedInstance;
}

其中“sharedInstance”是指向我的appDelegate单例的指针

答案 46 :(得分:0)

进行ARC更改:

更改为

@synthesize window;

而不是

@synthesize window=_window;

答案 47 :(得分:0)

我收到了相同的错误消息,因为我在

中调用了一个警告
- (void)applicationDidBecomeActive:(UIApplication *)application 

而不是

- (void)applicationWillEnterForeground:(UIApplication *)application

答案 48 :(得分:0)

我正在将旧的EAGLView示例项目迁移到Xcode 4中的新GLKView示例项目,并且没有一个解决方案适合我。最后我意识到我正在尝试将主要的GLKViewController的self.view设置为指向Interface Builder中的嵌套GLKView。

当我将self.view指向Interface Builder中的根GLKView时,我的应用程序可以在没有错误消息的情况下启动(因此请确保将视图控制器的视图设置为根视图)。 /强>

P.S。如果要使嵌套的GLKView工作,请在ViewController.h中创建一个新的成员变量,如self.glkSubview,并将其连接拖到Interface Builder中的嵌套GLKView中。然后确保将self.glkSubview的委托拖到File的所有者。您必须在“ - (void)glkView:(GLKView *)视图drawInRect:(CGRect)rect”中手动调用[self.glkSubview display],如果您为GLKView关闭了setNeedsDisplay。

答案 49 :(得分:-7)

验证您的STORYBOARD文件...如果您使用IB将代码'连接'到您的UI ...并且恰好删除了UI元素...然后意识到,哦,您需要删除代码中的引用(在我看来是一个名为AbortButton的UIButton)......然后片刻之后应用程序将无法启动......

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

例如:

&LT;关系&GT;     &lt; relationship kind =“outlet”name =“AbortButton”candidateClass =“UIButton”/&gt;

我的代码中不再存在...(但我仍然在故事板文件中链接了'连接器')..

我也有(从UIImageView或ToolBar到我的主要UIViewController.view对象的某种方式和无效的连接器)......不要认为它喜欢这个......

底线 - 一个人不需要手动“编码控制器”就可以了...... STORYBOARD文件被打破了。我修好了,宾果游戏又完美了......

和顺便说一句,作为一个文本编码器..我越来越喜欢IB ......在MS Visual Studio的IDE上屁股......