通常我正在製作iOS應用程序,但現在我正在嘗試製作一個OS X應用程序,並且我一開始就迷路了。說我使iOS應用程序完全程序化的風格,沒有任何xib文件,或者只是因爲我通過輸入而不是拖動來控制更多。但是在OS X編程中,它開始於一些帶有菜單項和默認窗口的xib文件。菜單項中有相當多的項目,所以這可能不是我想要弄亂的東西,但我想以編程方式自己創建我的第一個窗口。以編程方式創建可可應用程序的初始窗口(OS X)
所以我這樣做:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSUInteger windowStyleMask = NSTitledWindowMask|NSResizableWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask;
NSWindow* appWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(200, 200, 1280, 720) styleMask:windowStyleMask backing:NSBackingStoreBuffered defer:NO];
appWindow.backgroundColor = [NSColor lightGrayColor];
appWindow.minSize = NSMakeSize(1280, 720);
appWindow.title = @"Sample Window";
[appWindow makeKeyAndOrderFront:self];
_appWindowController = [[AppWindowController alloc] initWithWindow:appWindow];
[_appWindowController showWindow:self];
}
所以在這裏,我創建了一個窗口,第一,並使用該windowController來初始化窗口。窗口以這種方式顯示,但我只能在這裏指定內部元素,如按鈕和標籤,但不能在windowController中指定。這讓我感覺不好,所以我嘗試了另一種方式。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
_appWindowController = [[AppWindowController alloc] init];
[_appWindowController showWindow:self];
}
並在此之後我想設置在windowController的loadWindow:
功能這樣的其它元素:
- (void)loadWindow
{
[self.window setFrame:NSMakeRect(200, 200, 1280, 720) display:YES];
self.window.title = @"Sample window";
self.window.backgroundColor = [NSColor lightGrayColor];
NSButton* sampleButton = [[NSButton alloc] initWithFrame:NSRectFromCGRect(CGRectMake(100, 100, 200, 23))];
sampleButton.title = @"Sample Button!";
[sampleButton setButtonType:NSMomentaryLightButton];
[sampleButton setBezelStyle:NSRoundedBezelStyle];
[self.window.contentView addSubview:sampleButton];
NSLog(@"Loaded window!");
[self.window makeKeyAndOrderFront:nil];
}
不幸的是,這永遠不會奏效。 loadWindow:
永遠不會被調用,也不windowDidLoad:
。他們去了哪裏?
請不要問我爲什麼不使用筆尖。我希望在內部製作一些高度自定義的視圖,可能是OpenGL,所以我不認爲nib可以處理它。如果有人能提供幫助,我將不勝感激。謝謝。
此外,誰知道如何從頭開始菜單項,編程?
我正在使用最新的XCode。
你的想法,XIBs無法處理OpenGL是扁平化的錯誤。 Apple提供了一個在XIB中使用的OpenGL視圖。 XIB可以處理任何以編程方式創建的視圖,它們很簡單,就是封裝這些項目的一種方式。 – sosborn
這適合某些情況,但請考慮iOS應用中的棋盤遊戲。每個棋子都是帶有自定義圖像的視圖,那麼您需要移動它們。如果窗口中的大部分視圖都是高度動態的,並且帶有動畫,很難想象如何在不大幅混亂的情況下實現它。 – wlicpsc
如果你正在使用OpenGL,你有一個視圖和所有的部分,以及OpenGL中沒有完成的部分。如果您在OpenGL中沒有這樣做,則適用相同的想法,您可以在您的XIB中擁有一個超級視圖,然後您可以編程方式使用其他視圖填充該視圖。通過這種方式,您可以獲得使用XIB的好處,同時仍然可以通過代碼控制遊戲板。 – sosborn