2009-09-22 1 views
7

Я пытаюсь показать NSPanel как лист. Я наивно что-то делаю в этих строках:Как показать NSPanel в качестве листа

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

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

По какой-то причине это ускользает от меня, это не работает. Когда эта часть кода вызывается, лист мгновенно мигает (из-за сообщения autorelease). Лист никогда не подключается к окну.

Если кто-нибудь может указать мне, где я могу найти дополнительную информацию, это было бы очень признательно.

ответ

16

Это звучит как классический случай проверки флажка «Visible at Launch» для панели в IB. Отключите это.

+0

Пятно на! Большое спасибо. –

2

Да, вам нужно владеть этим контроллером столько, сколько вы хотите, чтобы он продолжал функционировать. Вы не можете просто создать его, автоматизировать его и позволить ему умереть - вам нужно держаться за него столько, сколько вам нужно.

+0

При удалении сообщения автоопределения запрещается исчезновение панели, оно все равно не подключено к окну ... Я действительно недоумеваю. –

+2

Недостаточно просто не авторейтировать его. Это просто утечка. Вам нужно владеть тем, что вы создали, и отпустить его, когда вы закончите с ним (и * только *). Что касается подключения контроллера к окну, которое он контролирует, вы должны убедиться, что вы установили класс владельца файла, а затем подключите к нему окно «окно» вашего контроллера. Вы делаете оба из IB. –

1

Не забывайте, что если вы пытаетесь запустить это как «модальный» лист (т. Е. Он принимает приложение до тех пор, пока пользователь не отклонит его), вам нужно нажать новый цикл цикла.

Вы сделали лист, а затем не нажали новый цикл, так что ОС просто показывает лист, видит, что нет причин для его работы, и, таким образом, отключает его и возобновляет выполнение на следующем линия:

Я обычно делаю листы следующим образом:

- (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; 
} 

Тогда в вашей принимают и/или кнопку отмены процедуры:

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

} 

Я уверен, что есть, как чуть меньше кода, но я не смотрел на него глубоко, потому что этот способ отлично работает до сих пор ....

Предыдущие комментарии о времени жизни контроллера и объектов панели также релевантные - убедитесь, что вы точно понимаете, какие объекты вам нужны для жизни, когда отображается модальная панель.

+0

Этот метод устарел :( – ColdSteel

Смежные вопросы