2014-03-31 67 views
0

這是我在的applicationDidFinishLaunching功能代碼,編程方式創建的窗口不顯示爲正確的尺寸

// Create window 
NSWindow *window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 400, 300) 
    styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask) 
                 backing:NSBackingStoreBuffered defer:NO]; 

//Create gl view 
NSRect frame = [window contentRectForFrameRect:[window frame]]; 
MyOpenGLView *glView = [[MyOpenGLView alloc] initWithFrame:frame]; 

[window setContentView:glView]; 
[window makeFirstResponder:glView]; 

// Show up 
[window makeKeyAndOrderFront:self]; 

應用程序構建並運行。但是,當它運行時,窗口似乎是全屏。換句話說,我在左上角獲得應用程序的名稱,而屏幕上沒有任何其他變化。它就像我的屏幕一樣的空窗口。爲什麼會發生這種情況,我該如何解決?

附加信息:在MyOpenGLView類initWithFrame功能,

self = [super initWithFrame:frameRect]; 
[self myInit]; 
return self; 

回答

0

我要你使用自動引用計數(ARC),而不是手動引用計數猜測。回顧一下,這裏是你的代碼:

- (void)applicationDidFinishLaunching:(NSNotification *)notification { 

    NSWindow *window = [[NSWindow alloc] initWithContentRect: 
    NSMakeRect(0, 0, 400, 300) styleMask:(NSTitledWindowMask | NSClosableWindowMask | 
NSMiniaturizableWindowMask | NSResizableWindowMask) 
        backing:NSBackingStoreBuffered defer:NO]; 

    //Create gl view 
    NSRect frame = [window contentRectForFrameRect:[window frame]]; 
    MyOpenGLView *glView = [[MyOpenGLView alloc] initWithFrame:frame]; 

    [window setContentView:glView]; 
    [window makeFirstResponder:glView]; 

    // Show up 
    [window makeKeyAndOrderFront:self]; 

} 

在ARC,你在這個方法中創建這裏NSWindow只有持續的時間的方法。換句話說,它將被創建,顯示爲一瞬間(如果完全相同),然後將立即解除分配並從屏幕上移除。爲了保持它,你應該將它定義爲一個實例變量。例如:

MDAppController.h:

@interface MDAppController : NSObject 

    @property (nonatomic, strong) NSWindow *window; 

    @end 

MDAppController.m:

- (void)applicationDidFinishLaunching:(NSNotification *)notification { 

    self.window = [[NSWindow alloc] initWithContentRect: 
         NSMakeRect(0, 0, 400, 300) 
        styleMask:(NSTitledWindowMask | NSClosableWindowMask | 
      NSMiniaturizableWindowMask | NSResizableWindowMask) 
        backing:NSBackingStoreBuffered defer:NO]; 
    // or 
    // _window = .... 

    // .... 
    // Show up 
    [self.window makeKeyAndOrderFront:self]; 
    // or 
    // [_window makeKeyAndOrderFront:self]; 
} 

在這裏,你的實例變量window設置爲NSWindow您創建和自認爲伊娃定義一樣強,它會在該方法返回後繼續存在。

+0

爲什麼你寫'self.window = ...',而不是隻是'window = ...',同樣顯示時也一樣?我確實理解你關於ARC行爲和刪除它的觀點,因爲它認爲我不再需要它了。 – chromozonex

+0

@ChromoZoneX:好吧,默認情況下,'window'的'@ synthesize''d ivar會被命名爲'_window'並帶有下劃線。您可以使用'_window'直接訪問代碼中的ivar,就像我在更新的例子中展示的那樣。在這種情況下,它可能不會影響你使用哪種方法.... – NSGod

+0

非常好,非常感謝! – chromozonex

相關問題