Должен ли я использовать NSViewController для этого? - PullRequest
2 голосов
/ 03 марта 2011

Я хочу, чтобы у моего приложения был один документ, но несколько экранов, не прибегая к нескольким окнам. Какой лучший способ достичь этого? Я подумываю об использовании одного NSPersistentDocument, который начнется с NSViewController, отображающего набор элементов управления, и затем поменяет это представление на другой NSViewController.

Мой вопрос: это правильное использование NSViewControllers? Можно ли это сделать? И если ответ на оба вопроса - «да», как мне поменять представление на другое в документе?

Ответы [ 3 ]

7 голосов
/ 05 марта 2011

Да, это вполне возможно сделать. Да, вы должны использовать контроллеры представления, но вам не нужно. Это строго стилистический выбор. Если вы не используете контроллер представления, тогда вся логика контроллера, вероятно, будет в вашем контроллере с одним окном. Это может быть больно для большого приложения. Контроллеры представления помогают вам разбить ваш пользовательский интерфейс на логические компоненты и блоки управления.

Вы бы применили метод контроллера вида следующим образом:

  • Создайте отдельные xibs для каждого из ваших представлений компонентов.
  • Для каждого xib создайте подкласс контроллера представления, который загружает, владеет им и управляет им.
  • Вы можете пойти дальше с этим и иметь контроллеры подвидов для отдельных областей в пределах видов.
  • В своем классе awakeFromNib вашего оконного контроллера создайте экземпляры всех ваших контроллеров представления верхнего уровня.

Теперь у вас есть базовая структура для приложения с несколькими контроллерами представления верхнего уровня. Отсюда задача состоит в том, чтобы расположить представления в главном окне так, как вам нужно или как диктует пользовательский ввод. Иногда у вас может быть 3-4 вида верхнего уровня, иногда 1, и в вашем случае вы просто хотите поменять одно на другое. Между этими сценариями нет большой разницы.

Есть много способов достичь этого.

Для вашего конкретного случая, простой способ это сделать:

  • Используйте представление таблиц верхнего уровня и вкладок без полей и установите выбранную вкладку программно.

В общем, вы можете сделать кучу вещей:

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

Кстати, этот метод работает независимо от того, создаете ли вы приложение на основе документа или нет, или это приложение на основе одного окна или нескольких окон.

Единственным недостатком использования контроллеров представления является большая часть макета представления верхнего уровня, и управление должно осуществляться программно, а не в IB. Но это не так сложно.

Обычно вам просто нужно сделать addSubview: и setFrame:, чтобы разместить ваши представления в родительском представлении, которое вы уже выложили в IB.

Но чтобы делать более сложные и ручные вещи, вы должны прочитать документы и узнать, как работают следующие: рамки / границы, перевернутые координаты, автоизменение размера и как переопределить автоизменение размера для создания собственных макетов.

0 голосов
/ 07 марта 2011

А как насчет использования NSNavigationController для управления несколькими видами - он позволяет легко выдвигать и выдвигать различные виды?

0 голосов
/ 03 марта 2011

Это можно сделать, как вы описали, но вам придется управлять отношениями с документом вручную, потому что конфигурация по умолчанию предполагает простоту отношения один документ -> один контроллер.

Отойдя от стандартного дизайна, вы потеряете все встроенные функции.

Возможно, вы захотите переосмыслить свой дизайн.Целью связывания документа с конкретным контроллером представления является предоставление пользователю метафоры для документа.Представление является документом для пользователя.Если вы предоставляете несколько представлений одного и того же документа, пользователь, скорее всего, будет интерпретировать, что у него несколько документов, потому что именно этого научила его грамматика пользовательского интерфейса.

Когда вы обнаружите, что делаете что-то нестандартное в пользовательском интерфейсе, остановитесь и тщательно подумайте.То, что вы, как разработчик, понимаете, что происходит, не означает, что пользователь будет это делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...