Вопрос по cocoa, objective-c – , Я добавляю сюда ссылку, чтобы помочь членам сообщества, которые ищут одинаковые ответы.

8

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

Я попытался добавить следующий контроллер и использовал 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 для создания человеческого интерфейса вашего приложения. Chris Hanson
@ctpenrose: комментарий не может быть неопытным, может только человек. И у меня нет опыта работы с Cocoa, Objective-C или Mac на протяжении многих лет, прежде чем Apple купила NeXT. Я снова и снова видел, что разработчики, привыкшие к другим инструментам (Windows / Java), сразу пытаются реализовать весь свой пользовательский интерфейс в коде, как вопрос ОП. Как я сказалв общем ты не должен этого делать, ты должен просто использовать IB. В тех случаях, когда это необходимо, используйте код, но будьте осторожны с ним, не дергайте его за колени, потому что инструменты других платформ - отстой. Chris Hanson
@Chris Hanson: Есть много причин для создания пользовательских интерфейсов программным способом. Думать, что всегда следует использовать Interface Builder, наивно. Если бы я только мог проголосовать за этот неопытный комментарий. ctpenrose
Я создаю порт другого инструментария GUI. Daniel Furrer
Из того, что я испытал, читая форумы разработчиков, это то, что комментарии, которые пытаются угадать намерение разработчика, а не отвечают на вопрос, часто не могут повысить ценность обсуждения. ctpenrose

Ваш Ответ

4   ответа
0

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

3

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

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

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

[[NSRunLoop currentRunLoop] run];

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

- Я портирую другой инструментарий GUI (написанный на другом языке программирования) на Mac. Так что графический интерфейс очень динамичен, и я не думаю, что есть смысл иметь NIB-файл. - Выйти: через меню приложения. - Вызов вызова приложения делает свое дело, спасибо! Благодарю. Daniel Furrer
9

nLoop] 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 инкапсулирует много о том, как получить событие, как отправить их и как обновить окна.

Здорово спасибо Это решает мою проблему. Откуда вы взяли этот исходный код? Так что кажется, что я могу даже где-то реализовать свой собственный цикл выполнения и использовать эту предоставленную логику. Daniel Furrer
Я создал этот код для своего блога:cocoawithlove.com/2009/01/demystifying-nsapplication-by.html Я реконструировал этот метод, внимательно прочитав документацию по NSApplication и угадав все возможные этапы, пока он не заработал. Matt Gallagher
2

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

Похожие вопросы