咨询:Xamarin中UIPickerViewDataSource与UIPickerViewModel的区别及是否仅Xamarin支持
UIPickerViewModel 是否仅存在于 Xamarin?与 UIPickerViewDataSource 的区别
结论:UIPickerViewModel 是 Xamarin.iOS 特有的封装
原生 iOS(Objective-C/Swift)中并没有 UIPickerViewModel 这个类,它是 Xamarin 为适配.NET 开发习惯,对原生 iOS 的 UIPickerViewDataSource 和 UIPickerViewDelegate 进行合并封装后的产物。
两者的核心区别
- 原生 iOS 架构:
原生环境下,UIPickerView的数据逻辑(列数、每行数据数量、内容)由UIPickerViewDataSource协议负责,交互与展示逻辑(行高、选中事件、自定义行视图)则由UIPickerViewDelegate协议负责,两个协议分离,开发者需要分别实现并绑定给选择器。 - Xamarin.iOS 的 UIPickerViewModel:
Xamarin 将原生两个协议的所有方法整合到UIPickerViewModel抽象类中,开发者只需继承该类,按需重写所需方法即可,无需分别处理两个协议,代码更集中,符合.NET 开发的类继承模式。
代码示例对比
原生 Swift 实现
class PickerHandler: NSObject, UIPickerViewDataSource, UIPickerViewDelegate { // DataSource 方法 func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return 5 } // Delegate 方法 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return "第 \(row+1) 行" } } // 绑定使用 let picker = UIPickerView() let handler = PickerHandler() picker.dataSource = handler picker.delegate = handler
Xamarin.iOS 实现
public class PickerViewModel : UIPickerViewModel { // 整合 DataSource 和 Delegate 的方法 public override nint GetComponentCount(UIPickerView pickerView) { return 1; } public override nint GetRowsInComponent(UIPickerView pickerView, nint component) { return 5; } public override string GetTitle(UIPickerView pickerView, nint row, nint component) { return $"第 {row+1} 行"; } } // 绑定使用 var picker = new UIPickerView(); picker.Model = new PickerViewModel();
本质上,UIPickerViewModel 就是 Xamarin 对原生两个协议的包装,功能上与原生同时实现 UIPickerViewDataSource + UIPickerViewDelegate 完全等价,只是代码组织形式更贴合.NET 开发者的习惯。
内容的提问来源于stack exchange,提问作者Pavlos Mavris
相关产品推荐
相关产品推荐

