【发布时间】:2013-03-19 15:20:09
【问题描述】:
通常我正在制作 iOS 应用程序,但现在我正在尝试制作 OS X 应用程序,而我一开始就迷路了。假设我制作 iOS 应用程序的风格完全是程序化的,没有 xib 文件或任何东西,因为我通过打字比拖动有更多的控制权。然而在 OS X 编程中,它以一些带有菜单项和默认窗口的 xib 文件开始。菜单项中有很多项,所以这可能不是我想乱七八糟的东西,但我想自己以编程方式创建我的第一个窗口。
所以我这样做了:
- (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。
【问题讨论】:
-
您认为 XIB 无法处理 OpenGL 的想法是完全错误的。 Apple 提供了在 XIB 中使用的 OpenGL 视图。 XIB 可以处理任何以编程方式创建的视图,它们是封装这些项目的一种简单方式。
-
这确实适用于某些情况,但想想 iOS 应用程序中的棋盘游戏。每个棋子都是带有自定义图像的视图,然后您需要移动它们。如果窗口中的大多数视图都是高度动态的,带有动画,那么很难想象如何在不造成大混乱的情况下实现它。
-
如果您使用 OpenGL,您将拥有一个视图和所有部分,而没有在 OpenGL 中完成。如果您不在 OpenGL 中执行此操作,则同样的想法也适用,您可以在 XIB 中拥有一个超级视图,然后您可以以编程方式使用其他视图填充该视图。通过这种方式,您可以获得使用 XIB 的好处,同时仍然在代码中控制您的游戏板。
-
那么你的意思是,在 xib 中创建一个大的自定义视图,然后以编程方式在代码中创建其他小视图?这听起来很有效,尽管关于根据窗口大小动态计算小视图的大小仍然存在更多问题。在 OS X 中它会改变,而在 iOS 中则不会。
-
在 autoResizingMask 属性中查看视图。或者当它改变时自己计算窗口大小。或者使用滚动视图。无论哪种方式,这些问题都已经解决了,您只需要为您的应用找到正确的方法。
标签: objective-c macos cocoa