繁体   English   中英

如何以编程方式创建 GUI 并响应 Cocoa 事件?

[英]How can I create a GUI and react to Cocoa events programmatically?

我发现了如何以编程方式在 Cocoa 中创建 window,但不知道如何对事件做出反应。 window 对退出请求或按钮单击没有反应。

我尝试添加以下 controller 并使用 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;
    }

您需要调用 -[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 封装了很多关于如何获取事件、如何调度它们以及如何更新 windows 的内容。

我发现了如何以编程方式在 Cocoa 中创建 window ...

为什么? 为什么不做一个笔尖?

window 对退出请求或按钮单击没有反应。

您将如何退出 window? 这不是 Windows 3; 在 Mac OS X 上,应用程序可以有多个 windows。因此,关闭 window 和退出应用程序是单独的操作。

[[NSRunLoop currentRunLoop] 运行];

除非在极少数情况下,运行运行循环是 NSApplication 的工作,你应该把它留给它。 使用NSApplicationMain-[NSApplication run]告诉应用程序运行。

很好的问题。 我认为 Matt Gallagher 已经回答了这个问题,但是如果您想进一步了解 go,您将不得不深入研究 Apple 的事件处理文档 请记住,以编程方式执行所有操作都需要对cocoa 基础知识有深入的了解。

我花了一整天的时间寻找这个问题的 GUI 和菜单部分的答案。 对于这个问题,目前没有那么多简明扼要的答案。 因此,在为自己解决之后,我在此处的 Stack 上发布了一个解决此问题的答案: Cocoa GUI Programmatically 我在这里添加了一个推荐,以帮助正在寻找相同答案的社区成员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM