【问题标题】:add GLKViewController to subview - GLKView context causes crash将 GLKViewController 添加到子视图 - GLKView 上下文导致崩溃
【发布时间】:2013-03-13 16:27:21
【问题描述】:

我有一个非常简单的设置,有一个 mainViewController,上面有一个 GLKViewController。这个想法是将我的 GLKViewController 放在一个盒子里,占据屏幕的 1/3,在 mainViewController 上。这可以在下面看到:

那个白框是我自己自定义的 GLKViewController,代码如下:

boxViewController.h

//boxViewController.h
#import <UIKit/UIKit.h>
#import <GLKit/GLKit.h>

@interface boxViewController : GLKViewController
@end

boxViewController.m

//boxViewController.m
#import "boxViewController.m"

@interface boxViewController () { }
@property (strong, nonatomic) EAGLContext *context;
@end

@implementation boxViewController

-(void)viewDidLoad {
    [super viewDidLoad];

    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    if (!self.context) {
        NSLog(@"Failed to create ES context");
    }

    GLKView *view = (GLKView *)self.view;
//    view.context = self.context;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
}

@end

viewDidLoad 中的mainViewController 上,我只需像这样调用boxViewController:

boxViewController* box = [[boxChartViewController alloc] init];
box.view.layer.frame = CGRectMake(10, 50, self.view.frame.size.width-20, self.view.frame.size.height/3);
[self.view addSubview:box.view];

效果很好。

请注意,在我的 boxViewController.m 中,view.context = self.context 被注释掉了。如果您取消注释,我的应用程序将崩溃而没有任何错误消息(它在 objc_msgSend 汇编代码中以 EXC_BAD_ACCESS 中断 [具体为第 8 行])。

当我设置上下文应用程序崩溃时,我做错了什么?从所有教程中,我注意到它们具有相同的设置,除了没有将控制器设置在另一个控制器上。虽然我不明白为什么 GLKViewController 不能被框架在另一个控制器上,所以我认为这不是问题。

【问题讨论】:

    标签: objective-c opengl-es-2.0 glkit glkview


    【解决方案1】:

    经过几个小时的折腾,我发现将 viewController 添加为子项是可行的:

    #import "mainViewController.h"
    
    @implementation mainViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.view.layer.backgroundColor = [UIColor colorWithRed:242.0f/255.0f green:242.0f/255.0f blue:242.0f/255.0f alpha:1.0].CGColor;
    
        boxViewController* chart = [[boxViewController alloc] init];
        chart.view.layer.frame = CGRectMake(10, 50, self.view.frame.size.width-20, self.view.frame.size.height/3);
        chart.view.layer.borderColor = [UIColor blackColor].CGColor;
        chart.view.layer.borderWidth = 2.0f;
        [self addChildViewController:chart];
        [self.view addSubview:chart.view];
    
    
    }
    

    【讨论】:

    • 我在尝试将 AdBannerView 添加为视图的子视图时遇到了同样的问题。不确定广告横幅是否设计用于控制器。显然 GLKView 似乎对没有控制器的子视图不满意。我在这里找不到有关确切问题的太多信息。你能得到更多关于这方面的信息吗?
    • 嘿@Shammi,我不确定它如何与集成 AdBannerView 和 GLKView 一起工作。您可能想问一个问题,以便其他人可以提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多