通常我正在制作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