Objective c 如何创建GUI并以编程方式响应Cocoa事件?
我发现了如何以编程方式在Cocoa中创建窗口,但不知道如何对事件做出反应。窗口未对退出请求或按钮单击作出反应 我尝试添加以下控制器并使用了setDelegate/setTarget,但没有成功:Objective c 如何创建GUI并以编程方式响应Cocoa事件?,objective-c,cocoa,Objective C,Cocoa,我发现了如何以编程方式在Cocoa中创建窗口,但不知道如何对事件做出反应。窗口未对退出请求或按钮单击作出反应 我尝试添加以下控制器并使用了setDelegate/setTarget,但没有成功: @interface AppController : NSObject { } - (IBAction)doSomething:(id)sender; @end @implementation AppController - (IBAction)doSo
@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;
}
我发现了如何以编程方式在Cocoa中创建窗口
为什么??为什么不做个笔尖呢
窗口未对退出请求或按钮单击作出反应
你会怎么离开窗户?这不是Windows3;应用程序在Mac OS X上可以有多个窗口。因此,关闭窗口和退出应用程序是两个独立的操作
[[nsrunlop currentRunLoop]run]
除非在极少数情况下,运行运行循环是非应用程序的工作,您应该让它来完成。使用
NSApplicationMain
或-[NSApplication run]
通知应用程序运行。您需要调用-[NSApplication run]而不是-[[nsrunlop currentlunloop]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封装了很多关于如何获取事件、如何调度事件以及如何更新windows的信息。非常好的问题。我认为马特·加拉赫已经回答了这个问题,但如果你想更进一步,你就必须深入研究苹果的产品。请记住,以编程的方式做每件事都需要对图形用户界面和菜单部分有深入的了解。我花了一整天的时间来寻找这个问题的答案。对于这个问题,目前没有那么多简洁的答案。所以,在为自己解决了这个问题之后,我在这里的堆栈上发布了一个解决这个问题的答案:。我在这里添加了一份推荐信,以帮助社区成员寻找相同的答案。首先,你为什么要这样做?您通常应该使用界面生成器来创建应用程序的人机界面。我正在创建另一个GUI工具包的端口。@克里斯·汉森:以编程方式构建用户界面有很多原因。认为应该始终使用界面生成器是天真的。要是我能投票否决这个没有经验的评论就好了。@cPenrose:评论不能没有经验,只有人可以。在苹果收购NeXT之前的很多年里,我对Cocoa或Objective-C或Mac开发并不缺乏经验。我一次又一次地看到,使用其他工具包(Windows/Java)的开发人员会立即尝试用代码实现他们的整个UI,就像OP的问题一样。正如我所说,一般来说,你不应该这样做,你应该只使用IB。在需要的情况下,使用代码,但要聪明,不要因为其他平台的工具很糟糕而下意识地使用它。从我阅读开发人员论坛的经验来看,这些评论试图猜测开发人员的意图,而不是回答问题,我正在将另一个GUI工具包(用另一种编程语言编写)移植到Mac上。因此GUI是非常动态的,我认为没有必要使用NIB文件。-退出:通过应用程序菜单-在应用程序上调用run就可以了,谢谢!谢谢,很好,谢谢。这就解决了我的问题。你从哪里得到这个源代码的?因此,似乎我甚至可以在某个地方实现自己的运行循环并使用提供的逻辑。我为我的博客文章创建了这段代码:我通过仔细阅读非应用程序的文档并猜测所有隐含步骤来重构此方法,直到它起作用。