我发现了如何以编程方式在Cocoa中创建一个窗口,但无法弄清楚如何对事件做出反应.该窗口不响应退出请求或按钮单击.
我尝试添加以下控制器并使用setDelegate/setTarget而没有运气:
@interface AppController : NSObject { } - (IBAction)doSomething:(id)sender; @end @implementation AppController - (IBAction)doSomething:(id)sender; { printf("Button clicked!\n"); } @end int main(int argc, char **args){ NSRect frame = NSMakeRect(0, 0, 200, 200); AppController *controller = [[AppController alloc] init]; > [[NSApplication sharedApplication] setDelegate:controller]; NSWindow* window = [[NSWindow alloc] initWithContentRect:frame styleMask:NSBorderlessWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask backing:NSBackingStoreBuffered defer:NO]; [window setBackgroundColor:[NSColor blueColor]]; NSButton *button = [ [ NSButton alloc ] initWithFrame: NSMakeRect( 30.0, 20.0, 80.0, 50.0 ) ]; [ button setBezelStyle:NSRoundedBezelStyle]; [ button setTitle: @"Click" ]; > [ button setAction:@selector(doSomething:)]; > [ button setTarget:controller]; [ [ window contentView ] addSubview: button ]; [window makeKeyAndOrderFront:NSApp]; [[NSRunLoop currentRunLoop] run]; return 0; }
Matt Gallagh.. 9
您需要调用 - [NSApplication run]而不是 - [[NSRunLoop currentRunLoop] run].如果你看一下方法的基本结构,原因应该是清楚的:
- (void)run { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [self finishLaunching]; shouldKeepRunning = YES; do { [pool release]; pool = [[NSAutoreleasePool alloc] init]; NSEvent *event = [self nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantFuture] inMode:NSDefaultRunLoopMode dequeue:YES]; [self sendEvent:event]; [self updateWindows]; } while (shouldKeepRunning); [pool release]; }
NSApplication封装了很多关于如何获取事件,如何调度它们以及如何更新窗口的内容.
您需要调用 - [NSApplication run]而不是 - [[NSRunLoop currentRunLoop] run].如果你看一下方法的基本结构,原因应该是清楚的:
- (void)run { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [self finishLaunching]; shouldKeepRunning = YES; do { [pool release]; pool = [[NSAutoreleasePool alloc] init]; NSEvent *event = [self nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantFuture] inMode:NSDefaultRunLoopMode dequeue:YES]; [self sendEvent:event]; [self updateWindows]; } while (shouldKeepRunning); [pool release]; }
NSApplication封装了很多关于如何获取事件,如何调度它们以及如何更新窗口的内容.