Модальный пользовательский лист не закрывается

Я пытаюсь отобразить пользовательское модальное диалоговое окно и делаю это следующим образом:

EncPasswordSheet имеет тип IBOutlet NSWindow *.

@implementation EncryptionPasswordSheet
-(id)init    
{    
    return self;    
}

- (void)showCustomDlg:(NSWindow *)window
{    
    if (!EncPasswordSheet)    
    {           
        [NSBundle loadNibNamed: @"EncryptionPasswordDlg" owner: self];
    }           
    [NSApp beginSheet:EncPasswordSheet modalForWindow:window modalDelegate:nil didEndSelector:nil contextInfo:nil];    
    [NSApp runModalForWindow: EncPasswordSheet];        
    [NSApp endSheet: EncPasswordSheet];    
    [EncPasswordSheet orderOut: self];      
}

- (IBAction)getPasswordFromSheet:(id)sender
{
    password = [passwordField stringValue];
    [NSApp stopModal];    
}

- (IBAction)cancelEncPasswordSheet:(id)sender    
{       
    password = nil;    
    [NSApp stopModal];        
}

@end

Диалоговое окно отображается и принимает ввод. При нажатии «ок» или «отмена» выполняются соответствующие методы IBAction, и программа продолжается. Проблема в том, что диалоговое окно не убирается с дороги, то есть не закрывается и не исчезает.


person King    schedule 27.08.2009    source источник
comment
Возможно, вы захотите переформатировать код, чтобы его было легче понять. Отступ с четырьмя пробелами для форматирования текста как кода.   -  person jergason    schedule 28.08.2009


Ответы (2)


Вы сняли флажок «Видимый при запуске» в Interface Builder для диалогового окна? Потому что, если я этого не сделаю, диалоговое окно не появится в виде листа и не закроется, когда закончите. Попробуйте это с вашим исходным кодом.

person Olivier 'Ölbaum' Scherler    schedule 28.08.2009
comment
да, пробовал этот трюк, но тоже не сработал. В любом случае спасибо за ответ. - person King; 29.08.2009
comment
Это странно, потому что я сделал тестовый проект, и он заработал. Ваше диалоговое окно на самом деле выглядит как лист, скользящий вниз из главного окна? Как вы вызываете showCustomDlg:? Через какое окно вы его проходите? - person Olivier 'Ölbaum' Scherler; 29.08.2009
comment
Я просто наткнулся на этот ответ, и это спасло мне жизнь. Я потратил 2 дня, пытаясь понять, почему мой модальный диалоговый лист не открывается как лист, а как окно ... Глупо видно при запуске +1 для вас, сэр! - person Bot; 10.03.2013

Я думаю, вам следует вызвать endSheet из действий IBActions, вызываемых вашими кнопками OK и Cancel, которые, как я полагаю, являются getPasswordFromSheet и cancelEncPasswordSheet:

- (void)showCustomDlg:(NSWindow *)window {
    if (!EncPasswordSheet) {
        [NSBundle loadNibNamed: @"EncryptionPasswordDlg" owner: self];
    }

    [NSApp beginSheet:EncPasswordSheet
      modalForWindow:window modalDelegate:nil
      didEndSelector:nil contextInfo:nil];
}

- (IBAction)getPasswordFromSheet:(id)sender {
    password = [passwordField stringValue];
    [EncPasswordSheet orderOut: self];
    [NSApp endSheet: EncPasswordSheet];
}

- (IBAction)cancelEncPasswordSheet:(id)sender {
    password = nil;
    [EncPasswordSheet orderOut: self];
    [NSApp endSheet: EncPasswordSheet];
}
person Olivier 'Ölbaum' Scherler    schedule 27.08.2009
comment
Спасибо Ольбаум за ответ. Я попробовал ваш метод, но он не сработал. проблема в том, что я должен использовать runModelForWindow, чтобы остановить выполнение программы, пока пользователь не введет ввод и не нажмет "ОК" или "Отмена". - person King; 28.08.2009
comment
Ты прав, извини. Пожалуйста, проигнорируйте этот ответ и посмотрите мой новый. - person Olivier 'Ölbaum' Scherler; 28.08.2009