Xamarin.Mac 中的常见模式和惯用语言

在整个通过 C# 公开的 Apple API 中,某些惯例和模式反复出现。 如果具有使用 Xamarin.iOS 进行编程的经验,这些内容可能看起来很熟悉。 文档通常会反复引用这些模式和惯例,因此对它们拥有扎实的理解将有助于你理解找到的文档。

MVC - 模型视图控制器

模型视图控制器(简称 MVC)是 Cocoa 中非常常见的一种模式。 本文档不详细探讨此概念,简言之,它是将应用程序构建到组件中的方法:

  • Model 对象表示正在查看和操作的基础数据(如通讯簿中的地址)
  • View 对象处理给定对象在屏幕上的绘图并处理用户交互(在屏幕上显示地址的文本字段)
  • Controller 对象处理 Model 和 View 之间的交互。 当用户在 UI 中进行更改时它们“向上”推送 Model 更改以更新 View 并“向下”推送 View 更改。

控制器的行为类似于 WPF 等其他库中的 MVVM(模型视图 ViewModel,如果了解的话),但通常会更紧密地绑定到特定 UI 元素。

此处提供了更多详细信息:

数据源/委托/子分类

Cocoa 中另一种非常常见的模式处理向 UI 元素提供数据并对用户交互做出反应的过程。 使用 NSTableView 作为示例,你需要以某种方式提供每个行的数据、提供表示该行的一组 UI 元素、一组对用户交互做出反应的行为,以及一定量的自定义。 使用数据源和委托模式可以处理大多数情况,而无需自行子类化 NSTableView

  • DataSource 属性分配 NSTableViewDataSource 的自定义子类的实例,将调用它为表填充数据(通过 GetRowCountGetObjectValue)。

  • Delegate 属性分配 NSTableViewDelegate 的自定义子类的实例,用于提供给定模型对象的视图(通过 GetViewForItem)和处理 UI 交互(通过 DidClickTableColumnMouseDownInHeaderOfTableColumn 等)。

在某些情况下,需要以超出委托或数据源中给定挂钩的方式进行控件自定义,并且可以直接对视图进行子类化。 但需要注意,在许多情况下,重写默认行为要求用户自己处理所有行为(对选择行为自定义可能需要用户自己实现所有选择行为)。

在 Xamarin.iOS 中,某些 API(如 UITableView)进行了扩展,具有一个属性可实现委托和数据源 (UITableViewSource)。 这是为了解决单个 C# 类只能有一个基类的常见限制,我们的协议呈现是通过基类完成的。

有关在 Xamarin.Mac 应用程序中使用表 VIews 的详细信息,请参阅表视图文档。

协议

Objective-C 中的协议相当于 C# 中的接口,许多时候可在类似情况中使用。 例如上面的 NSTableView 示例,委托和数据源实际上都是协议。 Xamarin.Mac 使用可以替代的虚拟方法将这些类公开为基类。 C# 接口和 Objective-C 协议的主要区别在于,协议中的某些方法可能是可选实现。 需要查看有关 API 的文档和/或定义,以确定哪些内容是可选的。

有关详细信息,请参阅委托、协议和事件文档。