【发布时间】:2009-03-17 21:35:54
【问题描述】:
我发现了如何以编程方式在 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;
}
【问题讨论】:
-
一开始为什么要这样做?您通常应该使用 Interface Builder 来创建应用程序的人机界面。
-
我正在创建另一个 GUI 工具包的端口。
-
@Chris Hanson:以编程方式构建用户界面的原因有很多。认为应该始终使用 Interface Builder 是幼稚的。要是我能拒绝这个没有经验的评论就好了。
-
@ctpenrose:评论不能没有经验,只有人才能。在 Apple 收购 NeXT 之前,我对 Cocoa 或 Objective-C 或 Mac 开发的经验并不陌生。我一次又一次地看到,习惯于其他工具包(Windows/Java)的开发人员会立即尝试用像 OP 的问题这样的代码来实现他们的整个 UI。正如我所说的一般你不应该那样做,你应该只使用IB。在需要它的情况下,使用代码,但要聪明,不要因为其他平台的工具很烂而下意识地使用它。
-
从我阅读开发者论坛的经验来看,cmet 试图猜测开发者的意图而不是回答问题,往往无法为讨论增加价值。
标签: objective-c cocoa