如何以编程方式创建 Cocoa 窗口?

我的 Cocoa 应用程序需要一些小的动态生成的窗口。我如何在运行时通过编程创建 Cocoa 窗口?

这是我到目前为止没有工作的尝试。我没有看到任何结果。

NSRect frame = NSMakeRect(0, 0, 200, 200);
NSUInteger styleMask =    NSBorderlessWindowMask;
NSRect rect = [NSWindow contentRectForFrameRect:frame styleMask:styleMask];


NSWindow * window =  [[NSWindow alloc] initWithContentRect:rect styleMask:styleMask backing: NSBackingStoreRetained    defer:false];
[window setBackgroundColor:[NSColor blueColor]];
[window display];
58509 次浏览

这是我自己想出来的:

NSRect frame = NSMakeRect(100, 100, 200, 200);
NSUInteger styleMask =    NSBorderlessWindowMask;
NSRect rect = [NSWindow contentRectForFrameRect:frame styleMask:styleMask];
NSWindow * window =  [[NSWindow alloc] initWithContentRect:rect styleMask:styleMask backing: NSBackingStoreBuffered    defer:false];
[window setBackgroundColor:[NSColor blueColor]];
[window makeKeyAndOrderFront: window];

这将显示一个蓝色窗口。我希望这是最佳方法。

试试看

[window makeKeyAndOrderFront:self];

而不是

[window display];

这就是你的目标吗?

问题是你不想调用 display,你想要调用 makeKeyAndOrderFront或者 orderFront,这取决于你是否希望窗口变成键窗口。您也许还应该使用 NSBackingStoreBuffered

这段代码将在屏幕左下角创建无边框的蓝色窗口:

NSRect frame = NSMakeRect(0, 0, 200, 200);
NSWindow* window  = [[[NSWindow alloc] initWithContentRect:frame
styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered
defer:NO] autorelease];
[window setBackgroundColor:[NSColor blueColor]];
[window makeKeyAndOrderFront:NSApp];


//Don't forget to assign window to a strong/retaining property!
//Under ARC, not doing so will cause it to disappear immediately;
//  without ARC, the window will be leaked.

您可以使 makeKeyAndOrderFrontorderFront的发件人适合您的情况。

另外,如果您希望通过编程方式实例化应用程序而不使用 main nib,那么可以在 main.m 文件/中按照下面的方式实例化应用程序。然后在您的应用程序支持文件/YourApp.plist 主笔记本基础文件/MainWindow.xib删除此条目。然后使用 Jason Coco 的方法将窗口附加到 AppGenerates init 方法中。

#import "AppDelegate.h":


int main(int argc, char *argv[])
{


NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
[NSApplication sharedApplication];


AppDelegate *appDelegate = [[AppDelegate alloc] init];
[NSApp setDelegate:appDelegate];
[NSApp run];
[pool release];
return 0;
}

将顶级答案翻译成现代雨燕(5)会给你类似的东西:

var mainWindow: NSWindow!


...


mainWindow = NSWindow(
contentRect: NSMakeRect(0, 0, 200, 200),
styleMask: [.titled, .resizable, .miniaturizable, .closable],
backing: .buffered,
defer: false)
mainWindow.backgroundColor = .blue
mainWindow.makeKeyAndOrderFront(mainWindow)