#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
розетку к самому окну. Исправлено, и теперь окно закрыто правильно.
Однако это не устраняет проблему отсутствия ответов на кнопки, когда это второе диалоговое окно отображается как лист.