Как я могу отключить представления в приложении какао? - PullRequest
8 голосов
/ 17 июля 2010

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

Во-первых, у меня есть главное меню («Начать игру», «Лучшие результаты», «Выход»).,Затем мне нужно окно для каждого экрана (экран геймплея, экран рекордов).

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

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

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

Ответы [ 4 ]

6 голосов
/ 18 июля 2010

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

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

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

Две вещи, о которых следует помнить:

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

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

5 голосов
/ 17 июля 2010

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

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

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

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

1 голос
/ 17 июля 2010

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

- (void)addSubview:(UIView *)view
- (void)removeFromSuperview
0 голосов
/ 31 октября 2013

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

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

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

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

...