Общие шаблоны и идиомы в Xamarin. MacCommon patterns and idioms in Xamarin.Mac

В интерфейсах API Apple, C#предоставляемых через, некоторые идиомы и закономерности снова возходят и снова.Throughout the Apple APIs exposed via C#, certain idioms and patterns come up over and over again. Если у вас есть опыт программирования с помощью Xamarin. iOS, они могут показаться знакомыми.If you have experience with programming with Xamarin.iOS, these may look familiar. Документация часто относится к этим шаблонам и идиомам многократно, поэтому знание этих шаблонов поможет понять, как вы найдете документацию.Documentation will often refer to these patterns and idioms repeatedly, so having a solid understanding of them will help you make sense of the documentation you find.

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

Модель представления модели или MVC для коротких версий — очень распространенный шаблон, который находится в Cocoa.Model View Controller, or MVC for short, is a very common pattern found throughout Cocoa. Подробное обсуждение выходит за рамки данного документа, но в кратком смысле это способ структуризации приложения на компоненты:A detailed discussion is beyond the scope of this document, but in brief it is a way of structuring your application into components:

  • Объекты модели представляют базовые данные, просматриваемые и обрабатываемые (например, адреса в адресной книге).Model objects represent the underlying data being viewed and manipulated (Like addresses in an address book)
  • Объекты представления обрабатывают Рисование данного объекта на экране и обрабатывая взаимодействие с пользователем (текстовое поле, в котором отображается адрес на экране)View objects handle the drawing of a given object on screen and handling user interaction (A text field showing the address on screen)
  • Объекты контроллера обработают взаимодействие между моделью и представлением.Controller objects handle the interaction between the Model and View. Они отправляют изменения модели "Up" для обновления представления и отправки "вниз" изменений из представления при внесении пользователями изменений в пользовательский интерфейс.They push Model changes "up" to update the View and push "down" changes from the View when users make changes in the UI.

Если вы знакомы с MVVM (представление модели ViewModel) из других библиотек, таких как WPF, контроллер действует аналогично ViewModel, но часто более тесно связан с конкретными элементами пользовательского интерфейса.If you are familiar with MVVM (Model View ViewModel) from other libraries such as WPF, the Controller acts similar to the ViewModel but is often more closely bound to the specific UI elements.

Дополнительные сведения можно найти здесь:More details can be found here:

Источник данных, делегаты и подклассыData source / delegate / subclassing

Другой очень распространенный шаблон в Cocoa заключается в предоставлении данных элементам пользовательского интерфейса и реагировании на взаимодействия пользователей.Another very common pattern in Cocoa deals with providing data to UI elements and reacting to user interactions. Используя NSTableView в качестве примера, необходимо каким – то образом предоставлять данные для каждой строки, некоторый набор элементов пользовательского интерфейса, представляющих эту строку, некоторый набор поведений, реагирующий на взаимодействие с пользователем, и, возможно, некоторый объем настройки.Using NSTableView as an example, you need to somehow provide the data for each row, some set of UI elements that represent that row, some set of behaviors to react to user interactions, and possibly some amount of customization. Шаблоны источников данных и делегатов позволяют справиться с большинством случаев, не прибегая к подклассу NSTableView .The data source and delegate patterns let you handle most cases without having to resort to subclassing NSTableView yourself.

  • Свойству назначается экземпляр пользовательского NSTableViewDataSource подкласса, который вызывается для заполнения таблицы данными (через GetRowCount и GetObjectValue). DataSourceThe DataSource property is assigned an instance of a custom subclass of NSTableViewDataSource which is called to populate the table with data (via GetRowCount and GetObjectValue).

  • GetViewForItem NSTableViewDelegate MouseDownInHeaderOfTableColumn DidClickTableColumnСвойству назначается экземпляр пользовательского подкласса, который предоставляет представление для данного объекта модели (через) и обрабатывает взаимодействия пользовательского интерфейса (через, и т. д.). DelegateThe Delegate property is assigned an instance of a custom subclass of NSTableViewDelegate which provides the view for a given model object (via GetViewForItem) and handles UI interactions (via DidClickTableColumn, MouseDownInHeaderOfTableColumn, etc).

В некоторых случаях требуется настроить элемент управления за пределами обработчиков, указанных в делегате или источнике данных, и можно напрямую создать подкласс представления.In some cases, you’ll want to customize a control in a way beyond the hooks given in the delegate or data source and you can subclass the view directly. Обратите внимание, что во многих случаях при переопределении поведения по умолчанию потребуется самостоятельно обрабатывать все это поведение (Настройка поведения выбора может потребовать реализации всех вариантов поведения выбора).Be careful however, in many cases overriding default behavior will then require you to handle all of that behavior yourself (customizing selection behavior may require you to implement all of the selection behaviors yourself).

В Xamarin. iOS некоторые API, например UITableView , были расширены с помощью свойства, реализующего делегат и источник данных (UITableViewSource).In Xamarin.iOS, some APIs, such as UITableView have been extended with a property that implements both the delegate and the data source (UITableViewSource). Это позволяет обойти общее ограничение того, что один C# класс может иметь только один базовый класс, и наши отображая протоколов выполняются через базовые классы.This it to work around the common limitation that a single C# class can only have one base class, and our surfacing of protocols is done via base classes.

Дополнительные сведения о работе с табличными представлениями в приложении Xamarin. Mac см. в нашей документации по табличному представлению .For more information on working with table VIews in a Xamarin.Mac application, please see our Table View documentation.

ПротоколыProtocols

Протоколы в цели-C можно сравнивать с интерфейсами C#в, и во многих случаях они используются в подобных ситуациях.Protocols in Objective-C can be compared to interfaces in C#, and in many cases are used in similar situations. Например, в NSTableView приведенном выше примере делегат и источник данных фактически являются протоколами.For example the NSTableView example above, both the delegate and the data source are actually protocols. Xamarin. Mac предоставляет эти базовые классы с виртуальными методами, которые можно переопределить.Xamarin.Mac exposes these as base classes with virtual methods you can override. Основное различие между C# интерфейсами и протоколами цели-C заключается в том, что некоторые методы в протоколе могут быть необязательными для реализации.The primary difference between C# interfaces and Objective-C protocols is that some methods in a protocol may be optional to implement. Чтобы определить, что является необязательным, необходимо ознакомиться с документацией и (или) определением API.You’ll have to look at the documentation and/or definition of an API to determine what is optional.

Дополнительные сведения см. в документации наших делегатов, протоколов и событий .More information please see our Delegates, Protocols and Events documentation.