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
的自定义子类的实例,将调用它为表填充数据(通过GetRowCount
和GetObjectValue
)。为
Delegate
属性分配NSTableViewDelegate
的自定义子类的实例,用于提供给定模型对象的视图(通过GetViewForItem
)和处理 UI 交互(通过DidClickTableColumn
、MouseDownInHeaderOfTableColumn
等)。
在某些情况下,需要以超出委托或数据源中给定挂钩的方式进行控件自定义,并且可以直接对视图进行子类化。 但需要注意,在许多情况下,重写默认行为要求用户自己处理所有行为(对选择行为自定义可能需要用户自己实现所有选择行为)。
在 Xamarin.iOS 中,某些 API(如 UITableView
)进行了扩展,具有一个属性可实现委托和数据源 (UITableViewSource
)。 这是为了解决单个 C# 类只能有一个基类的常见限制,我们的协议呈现是通过基类完成的。
有关在 Xamarin.Mac 应用程序中使用表 VIews 的详细信息,请参阅表视图文档。
协议
Objective-C 中的协议相当于 C# 中的接口,许多时候可在类似情况中使用。 例如上面的 NSTableView
示例,委托和数据源实际上都是协议。 Xamarin.Mac 使用可以替代的虚拟方法将这些类公开为基类。 C# 接口和 Objective-C 协议的主要区别在于,协议中的某些方法可能是可选实现。 需要查看有关 API 的文档和/或定义,以确定哪些内容是可选的。
有关详细信息,请参阅委托、协议和事件文档。