Модальная сессия требует модального окна
Я пытаюсь открыть окно, похожее на лист, чтобы оно отображалось внизу панели инструментов. Я использовал учебник О'Рейли, чтобы сделать это. Однако я могу обойти эту ошибку: модальный сеанс требует модального окна.
Окно загружается как окно, если у меня установлен флажок "Видимый при запуске".
Независимо от того, отмечен он или нет, я получаю сообщение об ошибке "Модальный сеанс требует модального окна".
У меня есть Window.xib, ProgressModal.xib.
В файле реализации окна я использую:
-(IBAction)loadProgress:(id)sender{
[self progressStatus:progressWindow];
}
- (void)progressStatus:(NSWindow *)window {
[NSApp beginSheet: window
modalForWindow: mainWindow
modalDelegate: nil
didEndSelector: nil
contextInfo: nil];
[NSApp runModalForWindow: window];
[NSApp endSheet: window];
[window orderOut: self];
}
- (IBAction)cancelProgressScrollView:(id)sender {
[NSApp stopModal];
}
Возможно, я неправильно настроил ProgressModal.xib. У меня есть NSObject в нем, который имеет "Окно" в качестве своего класса. Все связи сделаны через это.
Но опять же, он загружает окно, просто не загружает его как модальное.
Есть идеи?
3 ответа
Как я уже говорил выше, я перетащил объект в окно progressModal и через него установил соединение. Что я должен был сделать, так это сделать владельцем файла мой класс Window. Изменение, которое решило проблему.
Я получил это от http://www.youtube.com/watch?v=QBkO6TD-fWA
Поместите следующее в первую строку вашего progressStatus
метод:
NSLog(@"%@", window);
Если вы видите, что вывод журнала равен нулю, вот почему.
Шаги для создания модального листа с использованием XIB:
- Перетащите панель на свой MainMenu.xib
- добавлять
@property (assign) IBOutlet NSPanel *sheetPanel;
в вашемAppDelegate.h
файл @synthesize sheetPanel = _sheetPanel;
вAppDelegate.m
файл- Свяжите новый источник ссылок панели в файле MainMenu.xib, созданном на шаге 1, со свойством sheetPanel, созданным на шаге 2.
Используя следующий код, чтобы показать модальный лист:
[NSApp beginSheet:_sheetPanel modalForWindow:_mainWindow modalDelegate:self didEndSelector:@selector(didEndSheet:returnCode:contextInfo:) contextInfo:nil];
Изменить: я предположил, что вы хотели модальное окно. Если вы хотите лист, не используйте runModalForWindow:
совсем.
Попробуй это:
[NSApp beginSheet: window
modalForWindow: mainWindow
modalDelegate: nil
didEndSelector: nil
contextInfo: nil];
Хорошая идея определить обратный вызов на тот случай, если он вам понадобится; например
[NSApp beginSheet: window
modalForWindow: mainWindow
modalDelegate: self
didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:)
contextInfo: nil];