Как мне отключить представления в приложении Какао?

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

Во-первых, у меня есть главное меню (Start Game, High Scores, Exit). Затем мне нужно окно для каждого экрана (экран игрового процесса, экран рекордов).

Меня смущает то, как это спроектировать. Я поискал NSViewController, думая, что он управляет представлениями, но это не так. Он управляет только одним представлением, действительно загружая его. Я не понимаю, зачем мне тогда использовать NSViewController. Разве я не мог просто иметь класс окна, содержащий несколько подклассов NSView, и загружать их вот так? Я не уверен, что понимаю цель ViewController.

Действительно ли моему классу окна нужно создавать подкласс NSWindowController? Я пытался следовать примеру Apple ViewController, и у него есть класс оконного контроллера, который является подклассом NSWindowController. Я не понимаю, с какой целью это было подклассом. Кажется, что NSWindowController добавляет только - initWithPath:(NSString *)newPath, но я не вижу в этом пользы, когда я могу просто отредактировать файл plist, чтобы открыть окно при запуске. В примере Apple также есть переменная NSView и переменная NSViewController. Разве вам не нужна только одна переменная для хранения текущего представления?

Заранее спасибо, ребята, я действительно не понимаю, как это работает.


person David Garcia    schedule 17.07.2010    source источник


Ответы (4)


Похоже, вы пытаетесь поменять представление содержимого в окне? В этом случае вы можете использовать -[NSView replaceSubview:with:] с -[NSWindow contentView] в качестве получателя.

Предположим, у вас есть титульная страница с именем titleView и страница меню с именем menuView, и вы хотите поменять местами их в главном окне приложения и из него. Если титульная страница видна и пользователь нажимает кнопку или ссылку «главного меню», вы должны поместить что-то вроде этого в метод делегата кнопки:

[[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView];

Следует помнить о двух вещах:

  1. Старое представление, в данном случае titleView, отменяется этим вызовом. Если вы хотите, чтобы он оставался доступным, вам придется retain его перед заменой.
  2. Размер родительского представления не изменится, если ваши страницы имеют разные размеры. Изменить размер кадра окна и, следовательно, contentView достаточно просто, но вы можете добавить в микс немного базовой анимации, чтобы придать ему некоторый стиль.

Надеюсь, это поможет!

person Paul    schedule 18.07.2010
comment
Хорошо, спасибо! Я тоже займусь этим. Вы, ребята, действительно мне помогли. - person David Garcia; 18.07.2010

Вы используете NSWindowController и NSViewController для управления окном или представлением, потому что вам нужно только создать подклассы NSWindow или NSView для новых «типов» окна или представления. Например, если вы хотите использовать круглое окно, вы должны создать подкласс NSWindow. Если вы просто хотите иметь элементы управления в окне, вы создаете подкласс NSWindowController.

То же самое и с NSViewController: как правило, NSViewController's представление будет относиться к некоторому базовому классу, например NSView (или, возможно, к вашему собственному подклассу NSView, который рисует настраиваемый фон). NSViewController управляет взаимодействием между подпредставлениями этого представления, позволяя ему действовать как единое целое в вашем более крупном приложении.

Подумайте об этом так: представления рисуются и превращают необработанные входные события в действия более высокого уровня. Контроллеры предоставляют информацию представлениям и обрабатывают действия.

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

person Chris Hanson    schedule 17.07.2010
comment
Думаю, в этом есть больше смысла. Как вы думаете, мне нужно использовать initWithNibName:bundle: для загрузки представления, или я могу просто установить владельцем файла представления ViewController? - person David Garcia; 18.07.2010
comment
Вам нужно сделать и то, и другое. Вы используете -initWithNibName:bundle: для создания экземпляра подкласса NSViewController. Это загружает указанный файл пера и действует как его владелец; установите класс Владельца Файла наконечника на свой подкласс NSViewController и укажите точку просмотра Владельца Файла на ваше представление. - person Chris Hanson; 18.07.2010

Используйте следующие функции, определенные в UIVew (который является частью вашего существующего окна)

- (void)addSubview:(UIView *)view
- (void)removeFromSuperview
person Girish Kolari    schedule 17.07.2010
comment
тот же интерфейс доступен в Desktop (NSView) - person Girish Kolari; 17.07.2010
comment
Итак, я хотел бы знать, почему я должен использовать NSViewController. Нужно ли мне? Должен ли я создать подкласс NSWindowController с переменной NSView и NSViewController? Я не уверен, что действительно нужно для создания окна с переключаемыми видами. Насколько я понимаю, мне вообще не нужен NSViewController, но я не знаю, поскольку в примере Apple он использовался, и он должен упростить вам жизнь. - person David Garcia; 17.07.2010
comment
Вы можете сделать просмотр, решение о замене можно сделать в ViewController. Apple Document: приложение изменяет содержимое этого окна, представляя новый набор представлений с помощью объекта контроллера представления. - person Girish Kolari; 20.07.2010

Я новичок в какао, но думаю, что вашему приложению на самом деле не требуется NSViewController. NSViewController играет роль «Контроллера» в шаблоне проектирования MVC. Таким образом, он «контролирует» все действия - логику склеивания - в рамках единого представления.

Например, в представлении с несколькими элементами управления: кнопки, таблицы, флажки :, средства выбора даты в текстовых полях и т. Д., Вероятно, существует подробное взаимодействие между этими элементами управления, для которых требуются привязки и обновления. Например, нажатие кнопки загружает выборку из базы данных с обработкой ошибок и проверкой. Эта связующая логика входит в класс NSViewController.

Кажется, что в вашем приложении каждое представление представляет собой простую страницу, практически не требующую контроля уровня представления. Итак, вам, вероятно, понадобится один NSWindowController, контроллер для обработки логики и событий перехода от страницы к странице.

Одним из способов обработки нескольких представлений, заполняющих одно окно, является использование NSTabView и установка стиля вкладки на «без полей» в IB. Затем используйте действие кнопки, чтобы выбрать требуемый NSTabViewItem. Во время разработки установите стиль tabview на «верхние вкладки», и IB позволит вам переходить через вложенные представления, которые вы хотите отобразить.

person skippyppp    schedule 31.10.2013