2011-11-08 7 views
32

Próbuję uzyskać okno logowania, aby wyświetlić jako arkusz z mojego MainWindow, ale za każdym razem, gdy próbuję wdrożyć metody AppKit błąd zawsze wyskakuje z różnych nieodróżnialnych powodów.Wyświetlanie okna kakao jako arkusza w Xcode 4 (OSX 10.7.2) z ARC

Żaden z przewodników online nie działa, kiedy zastosuję kod/dostosowane klasy do mojego własnego projektu, który nigdy nie działa.

Większość przewodników jest mocno nieaktualna, w tym dokumentacja Apple. I żaden z nich nie wydaje się być zgodny z automatycznym liczeniem odwołań. Lub interfejsy Xcode 4.

Czy ktoś będzie w stanie szczegółowo dla mnie w pełnym przewodnikiem, na najprostszy sposób wyświetlania arkusza po naciśnięciu przycisku na MainWindow.

Jeśli chcesz, możesz poprosić o więcej informacji.

Odpowiedz

92

Tutorial dla Xcode 4

Utwórz nowy projekt i dodać następujące AppDelegate.h i AppDelegate.m.

AppDelegate.h

#import <Cocoa/Cocoa.h> 

@interface AppDelegate : NSObject <NSApplicationDelegate> { 

    IBOutlet NSPanel *theSheet; 
} 

@property (assign) IBOutlet NSWindow *window; 

@end 

AppDelegate.m

#import "AppDelegate.h" 

@implementation AppDelegate 

@synthesize window = _window; 

- (IBAction) showTheSheet:(id)sender { 

    [NSApp beginSheet:theSheet 
     modalForWindow:(NSWindow *)_window 
     modalDelegate:self 
     didEndSelector:nil 
      contextInfo:nil]; 

} 

-(IBAction)endTheSheet:(id)sender { 

    [NSApp endSheet:theSheet]; 
    [theSheet orderOut:sender]; 

} 

@end 

Otwórz MainMenu.xib.
Użyj istniejącego NSWindow.
Zrób to widoczne przy użyciu przycisku:

Xcode

Załóż nowy NSPanel.
Dodaj odpowiednią NSButtons.

Xcode

Połącz Close do App Delegate.

Xcode

I wybrać endTheSheet.

Xcode

Połącz Open do App Delegate.

Xcode

I wybrać showTheSheet.

Xcode

Podłączyć App Delegate do nowego NSPanel.

Xcode

I wybrać theSheet.

Xcode

Wybierz NSPanel i wyłączyć Visible At Launch. (! Istotnym krokiem)

Xcode

Teraz hit bieg i cieszyć się wynik:

Xcode

+8

Przerzucasz zdumiewająco! te zrzuty ekranu są naprawdę miłe i pomocne, dziękuję bardzo. –

+0

Pytanie do Anne na powyższym przykładzie: jeśli chciałbym dodać NSTextField do arkusza, w jaki sposób mogę przesłać tekst tam iz powrotem między arkuszem a jego oknem nadrzędnym? – Woofy

+0

Przyszedłem dzisiaj. Niezwykle pomocne dzięki! – Hassan

5

Wiele się zmieniło w SDK 10.10 - rozmowy są prostsze do zrozumienia myślę. Okno rodzica jest odpowiedzialne za uruchamianie podrzędnego pliku NSWindow jako arkusza - a następnie przekazuje temu dziecku NSWindow do NSApp, aby działał modalnie. Następnie wykonaj odwrotność, aby rozwinąć.

Wyświetlanie arkusz

Aby wyświetlić arkusz zamiast dzwonić:

[NSApp beginSheet:theSheet 
    modalForWindow:(NSWindow *)_window 
    modalDelegate:self 
    didEndSelector:nil 
     contextInfo:nil]; 

Teraz wzywają okna nadrzędnego:

(void)beginSheet:(NSWindow *)sheetWindow 
completionHandler:(void (^)(NSModalResponse returnCode))handler 

A następnie uruchomić arkusz jak w pętla modalna, musisz także zadzwonić do NSApp z:

- (NSInteger)runModalForWindow:(NSWindow *)aWindow 

Arkusz Zamknięcie

Aby zamknąć arkusz, zadzwoń na okna nadrzędnego:

- (void)endSheet:(NSWindow *)sheetWindow 

co powoduje completionHandler z powyższego wezwania na ogień, - w którym można umieścić telefon aby zatrzymać uruchomiony modalne okno przez wywołanie NSApp z:

- (void)stopModalWithCode:(NSInteger)returnCode 

Pełna przykład

@implementation AppDelegate 

@synthesize window = _window; 

- (IBAction) showTheSheet:(id)sender { 

    [_window beginSheet: theSheet 
     completionHandler:^(NSModalResponse returnCode) { 
      [NSApp stopModalWithCode: returnCode]; 
     }]; 

    [NSApp runModalForWindow: theSheet]; 

} 

-(IBAction)endTheSheet:(id)sender { 
    [_window endSheet: theSheet]; 
} 

@end 
+1

Jeśli to nie powinno być tutaj (ponieważ tytuł jest specyficzny dla xcode 4, proszę dać mi znać przed zgłoszeniem, a ja go usunę) –

+2

Należy powiedzieć, że okno arkusza musi być ukryte przed wywołaniem funkcji beginSheet. wygląda jak arkusz, ale nie jest dołączony. – Lothar