Модальная сессия требует модального окна

Я пытаюсь открыть окно, похожее на лист, чтобы оно отображалось внизу панели инструментов. Я использовал учебник О'Рейли, чтобы сделать это. Однако я могу обойти эту ошибку: модальный сеанс требует модального окна.

Окно загружается как окно, если у меня установлен флажок "Видимый при запуске".

Независимо от того, отмечен он или нет, я получаю сообщение об ошибке "Модальный сеанс требует модального окна".

У меня есть 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:

  1. Перетащите панель на свой MainMenu.xib
  2. добавлять @property (assign) IBOutlet NSPanel *sheetPanel; в вашем AppDelegate.h файл
  3. @synthesize sheetPanel = _sheetPanel; в AppDelegate.m файл
  4. Свяжите новый источник ссылок панели в файле MainMenu.xib, созданном на шаге 1, со свойством sheetPanel, созданным на шаге 2.
  5. Используя следующий код, чтобы показать модальный лист:

    [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];
Другие вопросы по тегам