obj-c中是否有一种方法可以创建一个gui窗口,而没有.app包,只是可以解压缩?问题是我需要一个gui应用程序(只有一个对话框)。
我试过了: 将appkit.framework导入终端应用程序。 - 崩溃有很多原因。 我决定使用x11不是一个好主意,因为它不包含在OS X 10.8
中那么,有什么想法吗?
答案 0 :(得分:5)
遗憾的是,您需要运行NSApplication,但不需要应用程序包。
确保在创建项目时选择“Foundation”作为类型。然后你可以这样设置:
#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
@interface MyAppDelegate : NSObject <NSApplicationDelegate>
{
NSWindow *window;
}
@end
@implementation MyAppDelegate
-(id) init
{
self = [super init];
if (self)
{
// total *main* screen frame size //
NSRect mainDisplayRect = [[NSScreen mainScreen] frame];
// calculate the window rect to be half the display and be centered //
NSRect windowRect = NSMakeRect(mainDisplayRect.origin.x + (mainDisplayRect.size.width) * 0.25,
mainDisplayRect.origin.y + (mainDisplayRect.size.height) * 0.25,
mainDisplayRect.size.width * 0.5,
mainDisplayRect.size.height * 0.5);
/*
Pick your window style:
NSBorderlessWindowMask
NSTitledWindowMask
NSClosableWindowMask
NSMiniaturizableWindowMask
NSResizableWindowMask
*/
NSUInteger windowStyle = NSTitledWindowMask | NSMiniaturizableWindowMask;
// set the window level to be on top of everything else //
NSInteger windowLevel = NSMainMenuWindowLevel + 1;
// initialize the window and its properties // just examples of properties that can be changed //
window = [[NSWindow alloc] initWithContentRect:windowRect styleMask:windowStyle backing:NSBackingStoreBuffered defer:NO];
[window setLevel:windowLevel];
[window setOpaque:YES];
[window setHasShadow:YES];
[window setPreferredBackingLocation:NSWindowBackingLocationVideoMemory];
[window setHidesOnDeactivate:NO];
[window setBackgroundColor:[NSColor greenColor]];
}
return self;
}
- (void)applicationWillFinishLaunching:(NSNotification *)notification
{
// make the window visible when the app is about to finish launching //
[window makeKeyAndOrderFront:self];
/* do layout and cool stuff here */
}
- (void)applicationDidFinishLaunching:(NSNotification*)aNotification
{
/* initialize your code stuff here */
}
- (void)dealloc
{
// release your window and other stuff //
[window release];
[super dealloc];
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool
{
NSApplication *app = [NSApplication sharedApplication];
[app setDelegate:[[[MyAppDelegate alloc] init] autorelease]];
[app run];
}
return 0;
}
请记住该行[app run];阻塞,所以你必须在应用程序循环或新线程(首选应用程序循环)上运行你的逻辑。
希望它有所帮助。
编辑:嘘..我来不及了!答案 1 :(得分:1)
在不创建.app的情况下,您所描述的内容应该是可能的,但是您需要运行AppKit事件循环(否则,用户输入事件来自哪里?)。
最简单的方法是获取共享的NSApplication对象并调用其run方法。您可以使用nsrunloop手动设置事件循环,但是我不确定所需的输入源是否是公共API。
为什么你不想要.app?如果您遵循标准模式,那么无论您做什么都会更容易。
答案 2 :(得分:0)
我认为您应该创建一个cocoa应用程序,只需将所需文件拖放到新应用程序中即可。确保勾选“添加到目标”框和“将项目复制到目标...”
我已经制作了许多这些小助手应用程序,只是为了帮助我解决其他问题。这通常是我这样做的方式。