Открытие модального диалога (модального окна или листа) из другого модального диалога

#objective-c #cocoa

#objective-c #cocoa

Вопрос:

Мне нужно открыть модальное окно, которое может открыть другое модальное окно (или лист). Первое окно работает нормально, но второе ведет себя странно.

Вот как я открываю первое окно:

     RegisterDialog * registerDialog=[[RegisterDialog alloc] initWithWindowNibName:@"RegisterDialogMac"];
    NSWindow* window = [registerDialog window];
    [NSApp runModalForWindow:window];
 

Это окно ведет себя правильно и реагирует на любые кнопки, я просто добавил немного кода, чтобы остановить цикл модальных событий после нажатия на красную кнопку:

 - (void)windowWillClose:(NSNotification *)notification {
    [[NSApplication sharedApplication] stopModal];
}
 

ОК. Теперь я открываю второе диалоговое окно, если пользователь нажимает кнопку «Регистрация»:

 -(IBAction)registerPressed:(id)sender {
    RegistrationDialogMac* registrationDialog=[[RegistrationDialogMac alloc] initWithWindowNibName:@"RegistrationDialogMac"];   
    NSWindow* window = [registrationDialog window];
    [NSApp runModalForWindow:window];
}
 

Это второе диалоговое окно тоже работает нормально, но закрывается, только если нажать красную кнопку.

Вот как обрабатывается кнопка «Отмена»:

 -(IBAction)cancelPressed:(id)sender {
    [NSApp stopModal];
    [[self window] close];
}
 

После нажатия на нее цикл модальных событий останавливается, первое диалоговое окно становится активным, но второе окно по-прежнему остается здесь. Он закрывается, только если я нажимаю красную кнопку. Это странно, поскольку первое модальное окно правильно закрывается тем же кодом.

ОК. Я попытался пойти другим путем и запустить второе диалоговое окно в виде листа:

 -(IBAction)registerPressed:(id)sender {
    RegistrationDialogMac* registrationDialog=[[RegistrationDialogMac alloc] initWithWindowNibName:@"RegistrationDialogMac"];
    NSWindow* window = [registrationDialog window];
    [self.window beginSheet: window
          completionHandler:^(NSModalResponse returnCode) {   }
    ];
}
 

(Я отключил «Видимый при запуске», чтобы правильно нарисовать этот лист, прикрепленный к первому диалоговому окну)
Таким образом, второе диалоговое окно отображается, но игнорирует все нажатия кнопок. Графически кнопки нажимаются, но не обрабатываются. Этот код:

 -(IBAction)cancelPressed:(id)sender {
    NSLog(@"!");
    [[self window] close];
    //[NSApp endSheet:[self window]];  // may be this would be correct way to close sheet? Don't know as this method isn't run anyway
}
 

не выполняется вообще, в журнале нет ни одного символа «!».

Итак, я делаю что-то не так. На самом деле у меня почти нет опыта программирования на Mac, только Windows.

Ответ №1:

Обнаружено, что [self window] во втором диалоговом окне было nil , поэтому оно не могло ответить close . Проверил .xib — и, да, я забыл подключить window розетку к самому окну. Исправлено, и теперь окно закрыто правильно.

Однако это не устраняет проблему отсутствия ответов на кнопки, когда это второе диалоговое окно отображается как лист.