добавить GLKViewController в подвид - контекст GLKView вызывает сбой

Я имею в виду довольно простую настройку, имеющую 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

На моем mainViewController в viewDidLoad я просто вызываю 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. Если вы раскомментируете его, мое приложение выйдет из строя без каких-либо сообщений об ошибках (оно прерывается с помощью EXC_BAD_ACCESS в ассемблерном коде objc_msgSend [строка 8, чтобы быть конкретным]).

Что я делаю не так, что при установке контекста приложение вылетает? Из всех руководств я заметил, что они имеют одинаковую настройку, за исключением того, что контроллер не устанавливается на другой контроллер. Хотя я не понимаю, почему GLKViewController не может быть создан на другом контроллере, поэтому я не думаю, что это проблема.


person John Riselvato    schedule 13.03.2013    source источник


Ответы (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];


}
person John Riselvato    schedule 14.03.2013
comment
У меня та же проблема, когда я пытаюсь добавить AdBannerView в качестве дочернего элемента представления. Не уверен, что рекламный баннер предназначен для работы с контроллером. Очевидно, что GLKView не устраивает наличие дочерних представлений без контроллера. Я не могу найти много информации о точной проблеме здесь. Удалось ли вам получить больше информации об этом? - person Shammi; 08.05.2014
comment
Привет @Shammi, я не уверен, как это будет работать с интеграцией AdBannerView и GLKView. Возможно, вы захотите задать вопрос об этом, чтобы другие могли помочь. - person John Riselvato; 09.05.2014