Как показать лист из отдельного NIB - PullRequest
8 голосов
/ 21 июня 2011

Как поместить окно в отдельный NIB, присвоить ему собственный NSWindowController, заставить его выдвигаться в виде листа?

(Это типичная вещь для листов?)

Я пытаюсь показать пользовательский лист (окно, которое скользит вниз от строки заголовка родительского окна) из моего главного окна. То, что я пытаюсь сделать, является стандартным, я думаю, но я не могу найти четких примеров или объяснений того, как делать именно то, что я хочу.

Что я пытаюсь сделать:

  1. Моему делегату приложения принадлежит главное окно, в котором есть кнопка для открытия листа «Настройки».
  2. Лист «Настройки»:
  3. находится в отдельном NIB.
  4. имеет владельца файла, установленного на класс SettingsWindowController, который является подклассом NSWindowsController
  5. Когда пользователь нажимает «настройки», я пытаюсь использовать Apple [пример кода] [1]
- (void)showCustomSheet: (NSWindow *)window
// User has asked to see the custom display. Display it.
{
    if (!settingsSheet) 
    //Check the settingsSheet instance variable to make sure the custom sheet does not already exist.
        [NSBundle loadNibNamed:@"SettingsSheet" owner: self];
        //BUT HOW DOES THIS MAKE settingsSheet NOT nil?

    [NSApp beginSheet: settingsSheet
            modalForWindow: window 
            modalDelegate: self 
            didEndSelector: @selector(didEndSheet:returnCode:contextInfo:) 
            contextInfo: nil]; 

    // Sheet is up here.

    // Return processing to the event loop
} 

Прошу прощения за следующие упрощенные и многочисленные вопросы:

  • Когда я звоню, loadNibName:owner:, я не хочу, чтобы owner было self, потому что это заставляет мое приложение делегировать владельца "MyCustomSheet" - это то, для чего мой SettingsWindowsController должен быть , Однако я не знаю, как сделать SettingsWindowsController владельцем этого метода.
  • Если на моем листе установлен флажок «Видимый при запуске», то loadNibName:owner: немедленно отображает окно как обычное окно, а не как лист, выдвигающийся из главного окна.
  • Если на моем листе «Видимо при запуске» не отмечено, то beginSheet:modalForWindow:etc вызывает «Модальный сеанс требует модального окна». Я почти уверен, что это потому, что я сделал владельцем Nib self (как я уже упоминал).
  • В примере кода я не знаю, как перо с именем @ "SettingsSheet" "связано" с переменной экземпляра settingsSheet - но они, очевидно, связаны , потому что код сначала проверяет: if (!settingsSheet) (я отметил это комментарием //BUT HOW DOES THIS MAKE settingsSheet NOT nil?)

Спасибо за ваше терпение, прочитав все это!

1 Ответ

10 голосов
/ 22 июня 2011
  1. Создайте экземпляр SettingsWindowController, используйте initWithWindowNibName:

  2. Вы не хотите, чтобы это было видно при запуске.

  3. См. 1.

  4. Ваши переменные экземпляра будут доступны для SettingsWindowController

...