Создание кода xib в Xamarin.iOS

Средство Apple Interface Builder ("IB") можно использовать для визуального проектирования пользовательских интерфейсов. Определения интерфейса, созданные IB, сохраняются в XIB-файлах . Мини-приложения и другие объекты в XIB-файлах могут быть предоставлены "удостоверение класса", которое может быть пользовательским типом. Использование пользовательских типов позволяет настроить поведение мини-приложений и написать пользовательские мини-приложения.

Эти пользовательские классы обычно являются подклассами классов контроллеров пользовательского интерфейса. Они имеют выходы (свойства) и действия (события), которые могут быть подключены к объектам интерфейса. Во время выполнения IB загружается. В то время объекты создаются, а точки и действия подключены к различным объектам пользовательского интерфейса динамически. При определении этих управляемых классов необходимо определить все действия и точки, соответствующие ожидаемым IB. Visual Studio для Mac использует модель CodeBehind для упрощения кода. Xcode имеет аналогичную Objective-C модель. Но модель создания кода и соглашения Xamarin.iOS были более знакомы разработчикам .NET.

XIB-файлы и пользовательские классы

Можно определить пользовательские типы в XIB-файлах , а также использовать существующие типы из Cocoa Touch. Также можно использовать типы, определенные в других XIB-файлах , или определенные исключительно в коде C#. В настоящее время построитель интерфейсов не знает о типах, определенных за пределами текущего XIB-файла , поэтому он не будет перечислять их или отображать пользовательские точки и действия. Удаление этого ограничения планируется в будущем.

Пользовательские классы можно определить в XIB-файле с помощью команды "Добавить подкласс" на вкладке "Классы" конструктора интерфейсов. Мы называем эти классы классами CodeBehind. Если xib-файл имеет в проекте файл ".xib.designer.cs", Visual Studio для Mac автоматически заполняет его определениями частичных классов для всех пользовательских классов в XIB. Эти частичные классы называются "классами конструктора".

Генерирование кода

Создание кода включается наличием {0}файла .xib.designer.cs для любого XIB-файла{0} с действием сборки Page. Visual Studio для Mac создает частичные классы в файле конструктора для всех пользовательских классов, которые он может найти в XIB-файле. Visual Studio для Mac создает свойства для точек и частичных методов для действий.

Файл конструктора автоматически обновляется при изменении XIB-файла и Visual Studio для Mac восстанавливает фокус. Изменение файла конструктора не рекомендуется, так как изменения будут перезаписаны при следующем обновлении файла Visual Studio для Mac.

Регистрация и пространства имен

Visual Studio для Mac создает классы конструктора с помощью пространства имен проекта по умолчанию для расположения файла конструктора. Это поведение соответствует обычному пространству имен проекта .NET. Пространство имен файлов конструктора использует параметры пространства имен проекта по умолчанию и его политики именования .NET. Если пространство имен проекта по умолчанию изменяется, повторно созданные классы будут использовать новое пространство имен. После восстановления вы можете найти частичные классы больше не совпадать.

Чтобы класс был доступен Objective-C для обнаружения средой выполнения, Visual Studio для Mac применяет [Register (name)] атрибут к классу. Хотя Xamarin.iOS автоматически регистрирует производные классы NSObject, он использует полные имена .NET. Атрибут, применяемый Visual Studio для Mac, переопределяет поведение Xamarin.iOS, чтобы убедиться, что каждый класс зарегистрирован с именем, используемым в XIB-файле. Добавьте атрибут вручную для всех пользовательских классов, определенных с помощью IB, без использования Visual Studio для Mac для создания файлов конструктора. Это делает управляемые классы соответствующими ожидаемым Objective-C именам классов.

Классы не могут быть определены в нескольких XIB или конфликтуют.

Части классов, отличных от конструктора

Частичные классы конструктора не предназначены для использования как есть. Точки являются частными, и базовый класс не указан. Ожидается, что каждый класс будет иметь соответствующую часть класса non-designer в другом файле. Файл без конструктора задает базовый класс, управляет точками и определяет конструкторы, необходимые для создания экземпляра класса из машинного кода. Шаблоны XIB по умолчанию имеют части классов , отличные от конструктора, но для любых других пользовательских классов, которые вы определяете в XIB, необходимо добавить часть без конструктора вручную.

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

Обычно классы CodeBehind помещают в файл .xib.cs рядом с файлом {0}конструктора {0}.xib.designer.cs.

Созданные действия и точки

В классах частичного конструктора Visual Studio для Mac создает свойства, соответствующие любым подключенным точкам, определенным в IB, и частичным методам, соответствующим любым подключенным действиям.

Свойства выхода

Классы конструктора содержат свойства, соответствующие всем точкам, определенным в пользовательском классе. Эти свойства позволяют отложенной привязки. Они — это подробная информация о реализации моста Xamarin.iOS для Objective C. Думайте о них как эквивалентные частным полям, предназначенным для использования только из класса CodeBehind. Сделайте поле общедоступным, добавив общедоступный метод доступа к полю в части класса, отличной от конструктора.

Если свойства выхода определены для типа id (эквивалентно NSObject), генератор кода конструктора в настоящее время определяет самый сильный тип на основе объектов, подключенных к этой выходе, для удобства. Однако это поведение может не поддерживаться в будущих версиях. Рекомендуется явно вводить точки при определении пользовательского класса.

Свойства действия

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

  1. Если вы вводите partial в текст класса части класса, отличной от конструктора, Visual Studio для Mac предложит автозавершение подписей всех неисполнимых частичных методов.
  2. Сигнатуры частичных методов имеют атрибут, который предоставляет их Objective-C миру, чтобы они могли обрабатываться в качестве соответствующего действия.

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

Если действия определены для типа id отправителя (эквивалентно NSObject), генератор кода конструктора в настоящее время определяет самый сильный возможный тип на основе объектов, подключенных к данному действию. Однако это поведение может не поддерживаться в будущих версиях. Рекомендуется явно вводить действия при определении пользовательского класса.

Эти частичные методы создаются только для C#, так как CodeDOM не поддерживает частичные методы. Они не создаются для других языков.

Использование класса Cross-XIB

Иногда пользователи хотят ссылаться на один класс из нескольких XIB-файлов , например с контроллерами вкладок. Вы можете явно ссылаться на определение класса из другого XIB-файла или снова определить то же имя класса во втором XIB.

Последний случай может быть проблематичным из-за Visual Studio для Mac обработки XIB-файлов по отдельности. Visual Studio для Mac не удается обнаружить и объединить повторяющиеся определения. В конечном итоге могут возникать конфликты, применяющие атрибут Register несколько раз, когда один и тот же частичный класс определен в нескольких файлах конструктора. Последние версии Visual Studio для Mac пытаются устранить конфликты, но это может не всегда работать должным образом. В будущем это поведение, скорее всего, станет неподдерживаемым, а вместо этого Visual Studio для Mac сделает все типы, определенные во всех XIB-файлах и управляемом коде в проекте, непосредственно видимыми из всех XIB-файлов.

Разрешение типов

Типы, используемые в IB, — это Objective-C имена типов, сопоставленные с типами CLR с помощью атрибутов register. При создании кода Visual Studio для Mac будет разрешать типы СРЕДЫ CLR, полностью квалифицируя имена типов к типамObjective-C. Эти Objective-C типы упаковываются в ядро Xamarin.iOS.

Генератор кода в настоящее время не может разрешать типы СРЕДЫ CLR из Objective-C имен типов в пользовательском коде или библиотеках. В таких случаях он выводит полное имя типа. Он должен иметь то же имя, что Objective-C и тип, чтобы правильно разрешить тип СРЕДЫ CLR. Тип СРЕДЫ CLR должен находиться в том же пространстве имен, что и код, использующий его. Будущие версии генератора кода будут учитывать все Objective-C типы в проекте.