2011-01-19 8 views
2

インタフェースビルダーからxibファイルなしで実行されているXCode OpenGL ESテンプレートを取得しようとしました。 しかし、まだ [UIViewのsetContext:]:この行[(EAGLView *)self.view setContext:context];になって認識されていないセレクタがキャッチされない例外により「NSInvalidArgumentException」、理由にアプリを終了インスタンスに0x4b1fac0 を送った:「 - [UIViewのsetContext:]:認識されていないセレクタはインスタンスに0x4b1fac0UIViewControllerをプログラムで読み込みますか? (OpenGL ES 2.0)

を送りました

私は間違っていますか?

main.mm

int main(int argc, char *argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    int retVal = UIApplicationMain(argc, argv, nil, @"myAppDelegate"); 
    [pool release]; 
    return retVal; 
} 

myAppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.viewController = [[myViewController alloc] initWithNibName:nil bundle:nil]; 
    self.window.rootViewController = self.viewController; 
    return YES; 
} 

私は私のplistファイルからデフォルトのXIB(とからXIBファイルを削除

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle 
{ 
    EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
    if (!aContext) { 
     aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; 
    } 
    if (!aContext) 
     NSLog(@"Failed to create ES context"); 
    else if (![EAGLContext setCurrentContext:aContext]) 
     NSLog(@"Failed to set ES context current"); 

    self.context = aContext; 
    [aContext release]; 

    [(EAGLView *)self.view setContext:context]; 
    [(EAGLView *)self.view setFramebuffer]; 

    if ([context API] == kEAGLRenderingAPIOpenGLES2) 
     [self loadShaders]; 

    animating = FALSE; 
    animationFrameInterval = 1; 
    self.displayLink = nil; 
    return 0; 
} 

myViewController.mプロジェクト)とすべてのIBoutlet。私は何かを見逃しましたか?私はappDelegateが間違っていると推測していますが、何か理由が分かりません。どんな助けも高く評価されます。

答えて

6

EAGLViewではなく、標準UIViewでsetContextを呼び出すようです。あなたのビューコントローラは、おそらく-loadViewを実装しており、このような何かを行う必要があります。奇妙に思える

- (void)loadView { 
    self.view = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
} 

ことの一つは、あなたが私はあなたが必要と期待するものですinitWithNibNameではなく、initWithFrameであなたのビューコントローラを初期化しているということですnib/xibファイルを削除するときに行うべきことです。

私がやっていることは、多分助けになるでしょう。

(注:私はUIViewとEAGLViewであるサブビューを持つカスタムビューコントローラを持っています(ADBannerサブビューの追加作業も行っています)。コントローラのビューは、サブビューとしてウィンドウに追加しようとすると読み込まれます。)

main.m - similar。

AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Create the window programatically: 
    window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

    controller = [GLViewController alloc]; 
    [window addSubview:controller.view]; 
    glView = [controller.glView retain]; 

    [window makeKeyAndVisible]; 

    return YES; 
} 

ViewController.h:

@interface GLViewController : UIViewController <ADBannerViewDelegate> 
{ 
    EAGLView *glView; 
} 
@property(nonatomic, retain) /*IBOutlet*/ EAGLView *glView; 
@end 

ViewController.m:

- (void)loadView 
{ 
    self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
} 

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    glView = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    glView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin; 
    glView.userInteractionEnabled=YES; 
    [self.view addSubview:glView]; 
} 

EAGLView.m:

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;// JPS - WARNING: this does not work on iOS 3.2!!! 

     self.contentScaleFactor = [UIScreen mainScreen].scale; 
     CGSize displaySize = [[UIScreen mainScreen]currentMode].size; 
     CGRect displayRect = [UIScreen mainScreen].bounds; 

     eaglLayer.frame = displayRect; 
     eaglLayer.opaque = YES; 
     eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys : [NSNumber numberWithBool : NO], 
                kEAGLDrawablePropertyRetainedBacking, 
                kEAGLColorFormatRGBA8, 
                kEAGLDrawablePropertyColorFormat, nil]; 

     context = [[EAGLContext alloc] initWithAPI : kEAGLRenderingAPIOpenGLES1]; 

     if (!context || ![EAGLContext setCurrentContext : context]) { 
      [self release]; 
      return; 
     } 

     glGenFramebuffersOES(1, &viewFramebuffer); 
     glGenRenderbuffersOES(1, &viewRenderbuffer); 

     glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
     glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
     [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer *)self.layer]; 
     glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); 

     glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
     glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 

     glGenRenderbuffersOES(1, &depthRenderbuffer); 
     glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); 
     glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); 
     glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); 

     // Set up thd display link to sync rendering with vblank 
     animating = FALSE; 
     displayLinkSupported = FALSE; 
     animationFrameInterval = 1; 
     displayLink = nil; 
     animationTimer = nil; 

     // A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer 
     // class is used as fallback when it isn't available. 
     NSString *reqSysVer = @"3.1"; 
     NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 
     if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) 
      displayLinkSupported = TRUE; 
    } 
    return self; 
} 
1

(EAGLView*) self.viewのキャストは機能していません。それはあなたがself.view = myEAGLView;というviewControllerのどこにも言及していないためUIViewであると考えています。また、UIViewがsetContext:に応答しないため、エラーが発生しています。注:一般的にOpenGLクラスの使用に慣れていませんが、これはもっと一般的なエラーのようです。

関連する問題