Как я могу создать графический интерфейс и программно реагировать на события Какао? - PullRequest
8 голосов
/ 18 марта 2009

Я узнал, как программно создать окно в Какао, но не могу понять, как реагировать на события. Окно не реагирует на запрос на выход или нажатие кнопки.

Я попытался добавить следующий контроллер и использовал 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;
    }

Ответы [ 4 ]

9 голосов
/ 18 марта 2009

Вам нужно вызвать - [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 содержит много информации о том, как получить событие, как его отправить и как обновить окна.

2 голосов
/ 18 марта 2009

Отличный вопрос. Я думаю, что Мэтт Галлахер уже ответил на это, но если вы хотите пойти дальше с этим, вам придется углубиться в документацию Apple по обработке событий . Имейте в виду, что выполнение всего программно потребует глубокого понимания основ какао .

2 голосов
/ 18 марта 2009

Я узнал, как программно создать окно в Какао…

Почему? Почему бы просто не сделать перо?

Окно не реагирует на запрос на выход или нажатие кнопки.

Как бы вы вышли из окна? Это не Windows 3; приложения могут иметь несколько окон в Mac OS X. Поэтому закрытие окна и выход из приложения являются отдельными действиями.

[[NSRunLoop currentRunLoop] run];

За исключением редких случаев, запуск цикла выполнения является задачей NSApplication, и вы должны оставить это ему. Используйте NSApplicationMain или -[NSApplication run], чтобы настроить приложение на запуск.

0 голосов
/ 24 февраля 2014

Я потратил целый день на поиски ответов на часть GUI и меню этого вопроса. Существует не так много текущих, кратких ответов на этот вопрос. Поэтому, решив это для себя, я разместил ответ, который решает эту проблему в стеке: Графический интерфейс какао Я добавляю сюда ссылку, чтобы помочь членам сообщества, которые копаются в поисках одинаковых ответов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...