2009-03-17 8 views
8

Dowiedziałem się, jak stworzyć program w kakao programowo, ale nie wiem, jak reagować na zdarzenia. Okno nie reaguje na żądanie Quit lub kliknięcie przycisku.Jak programowo można utworzyć GUI i reagować na zdarzenia Cocoa?

Próbowałem dodając następujący sterownik i używane setDelegate/SetTarget bez powodzenia:

@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; 
    } 
+1

Dlaczego chcesz to zrobić w pierwszej kolejności? Generalnie powinieneś używać Interface Builder do tworzenia ludzkiego interfejsu aplikacji. –

+2

Tworzę port innego zestawu narzędzi GUI. –

+0

@Chris: jednym z powodów dla mnie, aby przyjrzeć się programowemu tworzeniu GUI, jest to, że ładuję wiele obiektów z właściwościami z pliku, i muszę sprawić, aby wszystkie właściwości były edytowalne bez znajomości w czasie kompilacji ile ich jest, jak są one etykietowane i jaki to typ danych (float, int, NSString, NSPoint, ...). Chociaż myślę, że muszę wypełnić tylko pusty atrapa, ponieważ inne elementy interfejsu użytkownika są statyczne. – LearnCocos2D

Odpowiedz

9

Musisz wywołać - [Uruchom NSApplication] zamiast - [[NSRunLoop currentRunLoop] uruchom]. Powodem powinno być jasne, jeśli spojrzeć na podstawowej struktury metody:

- (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 obudowuje dużo o tym, jak dostać się zdarzenie, jak ich wysyłką i sposobu aktualizacji systemu Windows.

+0

Fajnie, dzięki. To rozwiązuje mój problem. Skąd masz ten kod źródłowy? Wydaje mi się, że mogę nawet wdrożyć własną pętlę uruchamiania i użyć tej dostarczonej logiki. –

+1

Utworzono ten kod dla mojego posta na blogu: http://cocoawithlove.com/2009/01/demystifying-nsapplication-by.html Przebudowałem tę metodę, uważnie czytając dokumentację dotyczącą aplikacji NSA i zgadując na wszystkich domniemanych krokach, aż pracował. –

3

I okazało się, jak stworzyć okno w kakao programowo ...

Dlaczego? Dlaczego nie po prostu zrobić stalówkę?

Okno nie reaguje na zapytanie o zamknięcie lub kliknięcie przycisku.

Jak wyjść z okna? To nie jest Windows 3; aplikacje mogą mieć wiele okien w systemie Mac OS X. Zamknięcie okna i zamknięcie aplikacji to oddzielne czynności.

[[NSRunLoop currentRunLoop] uruchom];

Poza rzadkimi przypadkami uruchamianie pętli uruchamiania jest zadaniem aplikacji NSApplication i należy je pozostawić. Użyj aplikacji NSApplicationMain lub -[NSApplication run], aby uruchomić aplikację.

+0

- Przesyłam kolejny zestaw narzędzi GUI (napisany w innym języku programowania) na komputer Mac. GUI jest bardzo dynamiczny i nie wydaje mi się, żeby istniał jakiś sens posiadania pliku NIB. - Wyjdź: Poprzez menu aplikacji - Wywołanie uruchomienia na aplikacji pozwala, dzięki! Dzięki. –

2

Doskonałe pytanie. Myślę, że Matt Gallagher już na to odpowiedział, ale jeśli chcesz pójść dalej, musisz zagłębić się w Apple'a event-handling documentation. Pamiętaj, że robienie wszystkiego programowo wymaga solidnego zrozumienia cocoa fundamentals.

0

Spędziłem cały dzień szukając odpowiedzi na GUI i część menu tego pytania. Na to pytanie nie ma zbyt wielu aktualnych, zwięzłych odpowiedzi. Więc po rozwiązaniu go dla siebie, napisałem odpowiedź, która odnosi się do tego na stos tutaj: Cocoa GUI Programmatically. Dodaję tutaj skierowanie, aby pomóc członkom społeczności, którzy szukają tych samych odpowiedzi.

Powiązane problemy