2009-09-22 11 views
7

Próbuję pokazać NSPanel jako arkusz. Naiwnie robię coś w tym stylu:Jak wyświetlić NSPanel jako arkusz

SheetController *sheetController = [[[SheetController alloc] 
             initWithWindowNibName:@"Sheet"] autorelease]; 

[[NSApplication sharedApplication] beginSheet:sheetController.window 
           modalForWindow:self.window 
           modalDelegate:self 
           didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) 
            contextInfo:nil]; 

Z jakiegoś powodu, który mi umyka, to nie działa. Kiedy ta część kodu jest wywoływana, arkusz chwilowo miga (z powodu komunikatu autorelease). Arkusz nigdy nie jest podłączony do okna.

Jeśli ktoś może wskazać mi, gdzie mogę znaleźć więcej informacji, byłoby to bardzo cenne.

Odpowiedz

16

To brzmi jak klasyczny przypadek sprawdzenia okna "Widoczne przy uruchomieniu" panelu w IB. Wyłącz to.

+0

Spot na! Wielkie dzięki. –

2

Tak, musisz posiadać kontroler tak długo, jak chcesz, aby dalej działał. Nie możesz po prostu go stworzyć, samozwalniać i pozwolić mu umrzeć - musisz go trzymać tak długo, jak tego potrzebujesz.

+0

Podczas usuwania komunikatu autooddzielania zapobiega zniknięciu panelu, nadal nie jest podpięty do okna ... Naprawdę jestem tym zmieszany. –

+2

Nie wystarczy po prostu nie autoreasować. To tylko przeciek. Musisz posiadać to, co stworzyłeś i zwolnić, gdy skończysz (i * tylko * wtedy). Jeśli chodzi o podłączenie kontrolera do okna, które kontroluje, musisz upewnić się, że ustawiłeś klasę Właściciela pliku, a następnie podłączyć wylot okna 'kontrolera 'do okna. Wykonujesz oba w IB. –

1

Nie zapominaj, że jeśli próbujesz uruchomić to jako arkusz "modalny" (tzn. Przejmuje on aplikację, dopóki użytkownik go nie odrzuci), musisz nacisnąć nową pętlę uruchamiania.

To, co zrobiłeś, to pokazany arkusz, a następnie nie pchnął nowej pętli, więc system operacyjny po prostu pokazuje arkusz, widzi, że nie ma powodu, aby go uruchamiać, a tym samym zamyka go i wznawia wykonywanie w następnym linia:

ja zazwyczaj Blachy zrobić w następujący sposób:

- (id)showPanelModalAgainstWindow: (NSWindow *)window 
{ 
    [[NSApplication sharedApplication] beginSheet: panelToShow 
       modalForWindow: window 
       modalDelegate: self 
       didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) 
       contextInfo: nil]; 

    [[NSApplication sharedApplication] runModalForWindow: panelToShow]; 
    if (m_returnCode == NSCancelButton) return nil; 
} 


- (void)sheetDidEnd:(NSWindow *)sheet 
     returnCode:(int)returnCode 
     contextInfo:(void *)contextInfo 
{ 
    UNUSED(sheet); 
    UNUSED(contextInfo); 
    m_returnCode = returnCode; 
} 

Następnie w swoim akceptują i/lub anuluj rutyny:

- (IBAction)continueButtonClicked:(id)sender 
{ 
    UNUSED(sender); 
    [[NSApplication sharedApplication] stopModal]; 
    [createAccountWizardPanel orderOut: nil]; 
    [[NSApplication sharedApplication] endSheet: createAccountWizardPanel 
             returnCode: NSOKButton]; 

} 

Jestem pewien, że jest trochę mniej kodu, ale nie zagłębiałem się w to, ponieważ ten sposób działa do tej pory perfekcyjnie dobrze ...

Poprzednie komentarze dotyczące czasu życia kontrolera i obiektów panelu są również istotne - upewnij się, że dokładnie wiesz, jakie obiekty potrzebujesz na czas życia podczas wyświetlania panelu modalnego.

+0

Ta metoda jest przestarzała :( – ColdSteel

Powiązane problemy