Общие шаблоны и идиомы в Xamarin.Mac

На протяжении всего API Apple, предоставляемых через C#, некоторые идиомы и шаблоны приходят снова и снова. Если у вас есть опыт программирования с помощью Xamarin.iOS, они могут выглядеть знакомы. Документация часто ссылается на эти шаблоны и идиомы неоднократно, поэтому наличие четкого понимания этих шаблонов поможет вам понять, что вы найдете документацию.

MVC — контроллер представления модели

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

  • Объекты модели представляют базовые данные, которые просматриваются и управляются (например, адреса в адресной книге)
  • Просмотр объектов обрабатывает рисунок данного объекта на экране и обрабатывает взаимодействие пользователя (текстовое поле с адресом на экране)
  • Объекты контроллера обрабатывают взаимодействие между моделью и представлением. Они передают изменения модели "вверх", чтобы обновить представление и отправить "вниз" изменения из представления, когда пользователи вносят изменения в пользовательский интерфейс.

Если вы знакомы с MVVM (View ViewModel) из других библиотек, таких как WPF, контроллер действует аналогично ViewModel, но часто более тесно связан с конкретными элементами пользовательского интерфейса.

Дополнительные сведения можно найти здесь:

Источник данных, делегат или подкласс

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

  • Свойство DataSource назначается экземпляр пользовательского подкласса NSTableViewDataSource , который вызывается для заполнения таблицы данными (через GetRowCount и GetObjectValue).

  • Свойство Delegate назначается экземпляр настраиваемого подкласса NSTableViewDelegate , который предоставляет представление для заданного объекта модели (через GetViewForItem) и обрабатывает взаимодействие пользовательского интерфейса (через DidClickTableColumn, MouseDownInHeaderOfTableColumnи т. д.).

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

В Xamarin.iOS некоторые API, такие как UITableView расширенные с помощью свойства, реализующего делегат и источник данных (UITableViewSource). Это позволяет обойти общее ограничение, что один класс C# может иметь только один базовый класс, и наши проверки протоколов выполняются с помощью базовых классов.

Дополнительные сведения о работе с таблицами VIews в приложении Xamarin.Mac см. в документации по представлению таблиц.

Протоколы

Протоколы в Objective-C C#можно сравнить с интерфейсами, и во многих случаях используются в аналогичных ситуациях. Например, приведенный NSTableView выше пример, делегат и источник данных фактически являются протоколами. Xamarin.Mac предоставляет эти классы в виде базовых классов с виртуальными методами, которые можно переопределить. Основное различие между интерфейсами C# и Objective-C протоколами заключается в том, что некоторые методы в протоколе могут быть необязательными для реализации. Вам придется ознакомиться с документацией и /или определением API, чтобы определить, что является необязательным.

Дополнительные сведения см. в документации по делегатам, протоколам и событиям .