Работа с раскадровками в Xamarin.Mac

Раскадровка определяет весь пользовательский интерфейс для данного приложения, разбитого на функциональный обзор контроллеров представления. В построителе интерфейсов Xcode каждый из этих контроллеров живет в собственной сцене.

A storyboard in Xcode's Interface Builder

Раскадровка — это файл ресурсов (с расширениями .storyboard), который включается в пакет приложения Xamarin.Mac при компиляции и доставке. Чтобы определить начальный раскадровки для приложения, измените его Info.plist файл и выберите главный интерфейс в раскрывающемся списке:

The Info.plist editor

Загрузка из кода

Иногда требуется загрузить определенный раскадровки из кода и создать контроллер представления вручную. Для выполнения этого действия можно использовать следующий код:

// Get new window
var storyboard = NSStoryboard.FromName ("Main", null);
var controller = storyboard.InstantiateControllerWithIdentifier ("MainWindow") as NSWindowController;

// Display
controller.ShowWindow(this);

Загружает FromName раскадровки файл с заданным именем, включенным в пакет приложения. Создает InstantiateControllerWithIdentifier экземпляр контроллера представления с заданным удостоверением. Вы задаете удостоверение в построителе интерфейсов Xcode при проектировании пользовательского интерфейса:

Setting the Storyboard ID in Interface Builder.

При необходимости можно использовать InstantiateInitialController метод для загрузки контроллера представления, назначаемого начальным контроллером в построителе интерфейсов:

Setting the initial controller

Он отмечен раскадровой точкой входа и открытой завершенной стрелкой выше.

Просмотр контроллеров

Контроллеры представления определяют связи между заданным представлением информации в приложении Mac и моделью данных, предоставляющей эти сведения. Каждая сцена верхнего уровня в раскадровке представляет один контроллер представления в коде приложения Xamarin.Mac.

Жизненный цикл контроллера представления

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

  • ViewDidLoad — Этот метод вызывается при загрузке представления из раскадровки-файла.
  • ViewWillAppear — Этот метод вызывается непосредственно перед отображением представления на экране.
  • ViewDidAppear — Этот метод вызывается непосредственно после отображения представления на экране.
  • ViewWillDisappear — Этот метод вызывается непосредственно перед удалением представления с экрана.
  • ViewDidDisappear — Этот метод вызывается непосредственно после удаления представления с экрана.
  • UpdateViewConstraints — Этот метод вызывается, когда ограничения, определяющие положение и размер автоматического макета представления, необходимо обновить.
  • ViewWillLayout — Этот метод вызывается непосредственно перед вложенными представлениями этого представления на экране.
  • ViewDidLayout — Этот метод вызывается непосредственно после того, как подвиды представления выкладываются на экране.

Цепочка ответов

Кроме того, NSViewControllers теперь являются частью цепочки ответов окна:

The Responder Chain

Таким образом, они подключены к получению и реагированию на такие события, как выбор элементов меню "Вырезать", "Копировать" и "Вставить". Это автоматическое подключение контроллера представления происходит только в приложениях, работающих в macOS Sierra (10.12) и больше.

Автономность

В раскадровки контроллеры представления (например, контроллер разделенного представления и контроллер представления табуляции) теперь могут реализовать хвалу, чтобы они могли содержать другие вложенные контроллеры представления:

An example of View Controller Containment

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

Все контроллеры представления контейнеров, встроенные в macOS, имеют определенный макет, который Apple предлагает следовать при создании собственных пользовательских контроллеров представления контейнеров:

The View Controller layout

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

Segues

Segues предоставляют связи между всеми сценами, определяющими пользовательский интерфейс приложения. Если вы знакомы с работой в раскадровки в iOS, вы знаете, что segues for iOS обычно определяют переходы между представлениями полноэкранного экрана. Это отличается от macOS, когда Segues обычно определяет "Containment", где одна сцена является дочерним элементом родительской сцены.

В macOS большинство приложений обычно группирует свои представления в одном окне с помощью элементов пользовательского интерфейса, таких как разделение представлений и вкладок. В отличие от iOS, где представления должны быть перенесены на экран и вне экрана, из-за ограниченного физического пространства отображения.

Презентации Segues

Учитывая тенденции macOS к сдерживанию, существуют ситуации, когда используются segues презентации, такие как модальные окна, представления листов и всплывающие окна. macOS предоставляет следующие встроенные типы segue:

  • Показать — отображает целевой объект Segue как не модальное окно. Например, используйте этот тип Segue для представления другого экземпляра окна документа в приложении.
  • Модал — представляет цель Segue в виде модального окна. Например, используйте этот тип Segue, чтобы представить окно параметров для приложения.
  • Лист — представляет целевой объект Segue в виде листа , присоединенного к родительскому окну. Например, используйте этот тип segue, чтобы представить лист поиска и замены.
  • Popover — представляет цель Segue, как в всплывающем окне. Например, используйте этот тип Segue для представления параметров при щелчке элемента пользовательского интерфейса пользователем.
  • Custom — представляет целевой объект Segue с помощью пользовательского типа Segue, определенного разработчиком. Дополнительные сведения см. в разделе "Создание пользовательских segues".

При использовании segues presentation можно переопределить PrepareForSegue метод родительского контроллера представления для представления для инициализации и переменных, а также предоставить любые данные для представленного контроллера представления.

Активированные segues

Активированные segues позволяют указать именованные segues (с помощью свойства идентификатора в Конструкторе интерфейсов) и активировать их событиями, такими как пользователь, щелкнув кнопку или вызвав PerformSegue метод в коде:

// Display the Scene defined by the given Segue ID
PerformSegue("MyNamedSegue", this);

Идентификатор segue определяется внутри построителя интерфейсов Xcode при создании пользовательского интерфейса приложения:

Entering a Segue Name

В контроллере представления, который выступает в качестве источника segue, необходимо переопределить PrepareForSegue метод и выполнить любую инициализацию, необходимую перед выполнением segue, и указанный контроллер представления отображается:

public override void PrepareForSegue (NSStoryboardSegue segue, NSObject sender)
{
    base.PrepareForSegue (segue, sender);

    // Take action based on Segue ID
    switch (segue.Identifier) {
    case "MyNamedSegue":
        // Prepare for the segue to happen
        ...
        break;
    }
}

При необходимости можно переопределить ShouldPerformSegue метод и контролировать, выполняется ли segue с помощью кода C#. Для контроллеров представления вручную вызовите метод DismissController , чтобы удалить их из отображения, когда они больше не нужны.

Создание пользовательских segues

Может возникнуть время, когда приложению требуется тип Segue, не предоставленный сборкой Segues, определенный в macOS. Если это так, можно создать пользовательский segue, который можно назначить в конструкторе интерфейсов Xcode при создании пользовательского интерфейса приложения.

Например, чтобы создать новый тип Segue, заменяющий текущий контроллер представления в окне (вместо открытия целевой сцены в новом окне), можно использовать следующий код:

using System;
using AppKit;
using Foundation;

namespace OnCardMac
{
    [Register("ReplaceViewSeque")]
    public class ReplaceViewSeque : NSStoryboardSegue
    {
        #region Constructors
        public ReplaceViewSeque() {

        }

        public ReplaceViewSeque (string identifier, NSObject sourceController, NSObject destinationController) : base(identifier,sourceController,destinationController) {

        }

        public ReplaceViewSeque (IntPtr handle) : base(handle) {
        }

        public ReplaceViewSeque (NSObjectFlag x) : base(x) {
        }
        #endregion

        #region Override Methods
        public override void Perform ()
        {
            // Cast the source and destination controllers
            var source = SourceController as NSViewController;
            var destination = DestinationController as NSViewController;

            // Swap the controllers
            source.View.Window.ContentViewController = destination;

            // Release memory
            source.RemoveFromParentViewController ();
        }
        #endregion

    }
        
}

Несколько вещей, которые следует отметить здесь:

  • Мы используем атрибут для предоставления этому классу RegisterObjective-C/macOS.
  • Мы переопределяем Perform метод для фактического выполнения действия пользовательского segue.
  • Мы заменяем контроллер Окна ContentViewController на тот, который определен целевым (назначением) segue.
  • Мы удаляем исходный контроллер представления для освобождения памяти с помощью RemoveFromParentViewController метода.

Чтобы использовать этот новый тип Segue в конструкторе интерфейсов Xcode, сначала необходимо скомпилировать приложение, а затем переключиться на Xcode и добавить новый segue между двумя сценами. Задайте для класса ReplaceViewSegue Style значение Custom и Segue (имя пользовательского класса Segue):

Setting the Segue class

Контроллеры окон

Контроллеры окон содержат и управляют различными типами окон, которые может создавать приложение macOS. Для раскадровки они имеют следующие функции:

  1. Они должны предоставить контроллер представления содержимого. Это будет тот же контроллер представления содержимого, который имеет дочернее окно.
  2. Свойство Storyboard будет содержать раскадровку, из которую был загружен контроллер окна, если null он не загружен из раскадровки.
  3. Метод можно вызвать, чтобы закрыть заданное DismissController окно и удалить его из представления.

Как и контроллеры представления, контроллеры окон реализуют PerformSeguePrepareForSegue и методы и ShouldPerformSegue могут использоваться в качестве источника операции segue.

Контроллер окон отвечает за следующие функции приложения macOS:

  • Они управляют определенным окном.
  • Они управляют строкой заголовка окна и панелью инструментов (если она доступна).
  • Они управляют контроллером представления контента для отображения содержимого окна.

Распознаватели жестов

Распознаватели жестов для macOS почти идентичны своим коллегам в iOS и позволяют разработчику легко добавлять жесты (например, нажатие кнопки мыши) к элементам в пользовательском интерфейсе приложения.

Однако, когда жесты в iOS определяются дизайном приложения (например, касанием экрана двумя пальцами), большинство жестов в macOS определяются оборудованием.

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

Вместо переопределения MouseDown события в контроллере представления следует использовать распознаватель жестов для обработки события ввода пользователем при работе с раскадровками.

В macOS доступны следующие распознаватели жестов:

  • NSClickGestureRecognizer — Регистрация событий мыши вниз и вверх.
  • NSPanGestureRecognizer — регистрирует кнопку мыши вниз, перетаскивает и освобождает события.
  • NSPressGestureRecognizer — регистрирует, удерживая кнопку мыши вниз в течение заданного периода времени.
  • NSMagnificationGestureRecognizer — регистрирует событие увеличения из оборудования трекпада.
  • NSRotationGestureRecognizer — регистрирует событие поворота из оборудования трекпада.

Использование ссылок на раскадровки

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

Кроме того, ссылка на раскадровки может предоставить привязку к другой сцене в той же раскадровки или определенной сцене в другой.

Ссылка на внешнюю раскадровку

Чтобы добавить ссылку на внешнюю раскадровки, сделайте следующее:

  1. В Обозреватель решений щелкните правой кнопкой мыши имя проекта и выберите "Добавить>новый файл" ...>Раскадровка Mac>. Введите имя новой раскадровки и нажмите кнопку "Создать":

    Adding a new Storyboard

  2. В Обозреватель решений дважды щелкните новое имя раскадровки, чтобы открыть его для редактирования в конструкторе интерфейсов Xcode.

  3. Создайте макет новых сцен раскадровки, как правило, и сохраните изменения:

    Designing the interface

  4. Переключитесь на раскадровки, в которую будете добавлять ссылку в построителе интерфейсов.

  5. Перетащите ссылку на раскадровку из библиотеки объектов в область конструктора:

    Selecting a Storyboard Reference in the Library

  6. В инспекторе атрибутов выберите имя раскадровки, созданной выше:

    Configuring the reference

  7. Щелкните мини-приложение пользовательского интерфейса (например, кнопку) на существующей сцене и создайте новую строку segue в только что созданной ссылке на раскадровки. В всплывающем меню выберите "Показать ", чтобы завершить segue:

    Setting the Segue type

  8. Сохраните изменения в раскадровки.

  9. Вернитесь к Visual Studio для Mac для синхронизации изменений.

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

Ссылка на определенную сцену во внешней раскадровки

Чтобы добавить ссылку на определенную сцену внешней раскадровки (а не начального контроллера окна), сделайте следующее:

  1. В Обозреватель решений дважды щелкните внешнюю раскадровки, чтобы открыть ее для редактирования в построителе интерфейсов Xcode.

  2. Добавьте новую сцену и создайте его макет, как обычно:

    Designing the layout in Xcode

  3. В инспекторе удостоверений введите идентификатор раскадровки для нового контроллера окна сцены:

    Setting the Storyboard I D to AltScene under Identity.

  4. Откройте раскадровки, в которую будете добавлять ссылку на конструктор интерфейсов.

  5. Перетащите ссылку на раскадровку из библиотеки объектов в область конструктора:

    Selecting a Storyboard Reference from the Library

  6. В инспекторе удостоверений выберите имя раскадровки и идентификатор ссылки (идентификатор раскадровки) созданной выше сцены:

    Setting the Reference I D to AltScene under Storyboard Reference.

  7. Щелкните мини-приложение пользовательского интерфейса (например, кнопку) на существующей сцене и создайте новую строку segue в только что созданной ссылке на раскадровки. В всплывающем меню выберите "Показать ", чтобы завершить segue:

    Setting the Segue Type

  8. Сохраните изменения в раскадровки.

  9. Вернитесь к Visual Studio для Mac для синхронизации изменений.

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

Ссылка на определенную сцену в той же раскадровки

Чтобы добавить ссылку на определенную сцену, сделайте следующее:

  1. В Обозреватель решений дважды щелкните раскадровку, чтобы открыть ее для редактирования.

  2. Добавьте новую сцену и создайте его макет, как обычно:

    Editing the storyboard in Xcode

  3. В инспекторе удостоверений введите идентификатор раскадровки для нового контроллера окна сцены:

    Setting the Storyboard I D to IntScene under Identity.

  4. Перетащите ссылку на раскадровку из панели элементов в область конструктора:

    Selecting a Storyboard Reference from the Library

  5. В инспекторе атрибутов выберите идентификатор ссылки (раскадровочный идентификатор ) сцены, созданной выше:

    Setting the Reference I D to IntScene under Storyboard Reference.

  6. Щелкните мини-приложение пользовательского интерфейса (например, кнопку) на существующей сцене и создайте новую строку segue в только что созданной ссылке на раскадровки. В всплывающем меню выберите "Показать ", чтобы завершить segue:

    Selecting the Segue Type

  7. Сохраните изменения в раскадровки.

  8. Вернитесь к Visual Studio для Mac для синхронизации изменений.

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

Пример сложной раскадровки

Сложный пример работы с раскадровками в приложении Xamarin.Mac см. в примере приложения SourceWriter. SourceWriter — это простой редактор исходного кода, который предоставляет поддержку для автозавершения и выделения простого синтаксиса.

Код SourceWriter полностью закомментирован, и там, где это возможно, предоставлены ссылки из основных технологий и методов на соответствующую информацию в документации по руководствам для Xamarin.Mac.