Я пробовал initWithWindowName,
Вы имеете в виду initWithWindow¹Nib²Name³:
, который принимает имя (3) пера (2), содержащего окно (1).
if (mmController == NULL)
Это должно быть nil
, а не NULL
, поскольку вы сравниваете указатель объекта Objective-C.
mmController = [[mainMenu alloc] initWithWindowNibName:@"mainMenu"];
Что такоеmainMenu
здесь?Это должен быть класс, но что это за подкласс?
[mmController showWindow:self];
Из этого сообщения и предыдущего сообщения я предполагаю, что mainMenu
является подклассом NSWindowController.
Гадать не нужно.Вы должны назвать свои классы конкретно, чтобы каждый мог сказать, что это за класс и его экземпляры просто по имени класса.
Краткость - это добродетель, но если вам нужно идти долго, то идите долго.У нас есть современные инструменты с дополнением имени.Клавиша табуляции может исключить единственное преимущество сокращенного имени.
, но открывает новое окно.
Да.Вы создали окно, загрузив его из пера, а затем сказали оконному контроллеру показать это окно.Отображение нового окна - ожидаемый результат.
Я также пробовал loadNibNamed
[NSBundle loadNibNamed:@"mainGame" owner:self];
, и это удалось, но когда я пытаюсь использовать тот же метод, чтобы вернуться к основномуменю,
Нет «возврата».Загрузка пера - это просто создание объектов путем загрузки их из архива.Вы можете загрузить один и тот же кончик несколько раз, и загрузка кончика каким-либо образом не отменяет результаты загрузки предыдущего кончика.
Возможно, вы захотите прочитать Руководство по программированию ресурсов , которое охватывает кончики.а также графические и звуковые файлы и Руководство по программированию пакета .
Если вы хотите скрыть окно, загруженное из пера mainGame
, сделайте это.Термин для этого в AppKit: «оформление заказа» (в отличие от «оформление заказа», в котором «оформление заказа» и «оформление заказа» являются конкретнымиспособы сделать).
[NSBundle loadNibNamed:@"mainMenu" owner:self];
это не работает.Он вообще ничего не делает ...
Вы пытаетесь загрузить перо MainMenu, которое входит в ваш проект?Если это так, убедитесь, что вы правильно указали регистр - вы не хотите, чтобы ваше приложение было сломано для людей, которые запускают его с тома, чувствительного к регистру, и не хотите, чтобы оно ломалось для людей, которые используют регистр по умолчанию без учета регистра.файловая система.
Если это не то, что вы пытаетесь сделать, тогда не ясно, что вы пытаетесь сделать.MainMenu - это обычно перо, содержащее главное меню (содержимое строки меню);Называя любое другое перо «mainMenu» или что-то подобное, в лучшем случае это вызовет путаницу, а в худшем - проблемы.Если предполагается, что это какой-то другой перо, вы должны дать ему другое имя.
В любом случае, это не то, что вам нужно делать.Если вы хотите скрыть окно, которое вы загрузили из mainGame
, то вам нужно скрыть это окно, а не загружать другое перо.
Более того, после загрузки окна не загружайте его снова (если вы незакройте и отпустите).После того, как вы загрузили его, вы можете просто заказать его обратно. Скорее всего, вам захочется как сделать его ключом, так и заказать его спереди .
На Mac вы не ограниченыпо одному окну за раз;действительно, ваше приложение имеет несколько окон (по крайней мере, три), независимо от того, что вы делаете.API-интерфейсы построены вокруг вашей способности показывать несколько окон.
Подробнее см. В руководстве по программированию окон .
Как загрузить перо внутридругое окно?
Как уже сказал вам Джастин Майнерс, для этого вам может потребоваться NSViewController, хотя вы можете обойтись без него и просто загрузить перо, содержащее представление, используя loadNibNamed:
.
Имейте в виду, что NSViewController не такой мощный и функциональный, как UIViewController от Cocoa Touch.
Для этого вам нужно прочитать Руководство по программированию .