загрузить перья в какао - PullRequest
2 голосов
/ 30 января 2011

Как я могу загрузить перо внутри другого окна?

Я пробовал initWithWindowName,

if (mmController == NULL)
    mmController = [[mainMenu alloc] initWithWindowNibName:@"mainMenu"];
[mmController showWindow:self];

но открывается новое окно.

Я также пробовал loadNibNamed

[NSBundle loadNibNamed:@"mainGame" owner:self];

и это успешно, но когда я пытаюсь использовать тот же метод, чтобы вернуться в главное меню,

[NSBundle loadNibNamed:@"mainMenu" owner:self];

это не работает. Это вообще ничего не делает ... Есть идеи?

1 Ответ

8 голосов
/ 30 января 2011

Я пробовал 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.

Для этого вам нужно прочитать Руководство по программированию .

...