Xamarin iOS UiPickerView教程

Xamarin iOS UiPickerView教程,ios,xamarin,uipickerview,Ios,Xamarin,Uipickerview,我试图找到一些关于在Xamarin iOS中使用UiPickerView的基本说明。这里有一些关于堆栈溢出的问题可以回答某些问题,但我只想简单地概述一下,并希望了解如何将UiPickerView添加到ViewController、连接数据和注册事件。作为Xamarin和iOS的不速之客,我正在努力为这种类型的控件的代码进行编目。在MonoCatalog MonoDevelop示例中,这听起来像是您所要求的 特别是,定义了CreateCustomPicker函数和CustomPickerModel

我试图找到一些关于在Xamarin iOS中使用UiPickerView的基本说明。这里有一些关于堆栈溢出的问题可以回答某些问题,但我只想简单地概述一下,并希望了解如何将UiPickerView添加到ViewController、连接数据和注册事件。作为Xamarin和iOS的不速之客,我正在努力为这种类型的控件的代码进行编目。

在MonoCatalog MonoDevelop示例中,这听起来像是您所要求的


特别是,定义了
CreateCustomPicker
函数和
CustomPickerModel
类型。

//将PickerViewModel设置为PickerView

var examplePVM = new ExamplePickerViewModel(myListOfItems);
YourPickerView.Model = examplePVM ;
//创建一个PickerViewModel

public class ExamplePickerViewModel : UIPickerViewModel
{
    private List<string> _myItems;
    protected int selectedIndex = 0;

    public ExamplePickerViewModel(List<string> items)
    {
        _myItems = items;
    }

    public string SelectedItem
    {
        get { return _myItems[selectedIndex]; }
    }

    public override nint GetComponentCount (UIPickerView picker)
    {
        return 1;
    }

    public override nint GetRowsInComponent (UIPickerView picker, nint component)
    {
        return _myItems.Count;
    }

    public override string GetTitle (UIPickerView picker, nint row, nint component)
    {
        return _myItems[row];
    }

    public override void Selected (UIPickerView picker, nint row, nint component)
    {
        selectedIndex = (int)row; 
    }
}
public类示例pickerviewmodel:UIPickerViewModel
{
私人物品清单;
受保护的整数selectedIndex=0;
公共示例PickerViewModel(列表项)
{
_myItems=项目;
}
公共字符串SelectedItem
{
获取{return}myItems[selectedIndex];}
}
公共覆盖nint GetComponentCount(UIPickerView选择器)
{
返回1;
}
公共覆盖nint GetRowsInComponent(UIPickerView选择器,nint组件)
{
return\u myItems.Count;
}
公共重写字符串GetTitle(UIPickerView选择器、第九行、第九组件)
{
返回_myItems[行];
}
已选择公共覆盖无效(UIPickerView选择器、第九行、第九组件)
{
selectedIndex=(int)行;
}
}
我创建了一个用于介绍UIPickerView基础知识的。这可能是令人困惑的基本想法:

  • 将UIPickerView添加到您的故事板等,并为其命名
  • 创建一个从
    UIPickerViewModel
  • 设置选择器的型号,
    pickerExample.model=newyourlistpicker(YourList)
  • 新类文件 //Picker数据模型类对于Picker视图,该类文件用于帮助器部分,以供通用

    public class PickerDataModel : UIPickerViewModel
    {
    public event EventHandler<EventArgs> ValueChanged;
    
    /// <summary>
    /// The items to show up in the picker
    /// </summary>
    public List<string> Items { get; private set; }
    
    /// <summary>
    /// The current selected item
    /// </summary>
    public string SelectedItem
    {
    get { return Items[SelectedIndex]; }
    }
    
    public int SelectedIndex
    {
    get
    {
    return selectedIndex;
    }
    
    set
    {
    selectedIndex = value;
    }
    }
    
    private int selectedIndex;
    
    public PickerDataModel()
    {
    Items = new List<string>();
    }
    
    /// <summary>
    /// Called by the picker to determine how many rows are in a given spinner item
    /// </summary>
    public override nint GetRowsInComponent(UIPickerView picker, nint component)
    {
    return Items.Count;
    }
    
    /// <summary>
    /// called by the picker to get the text for a particular row in a particular
    /// spinner item
    /// </summary>
    public override string GetTitle(UIPickerView picker, nint row, nint component)
    {
    return Items[(int)row];
    }
    
    /// <summary>
    /// called by the picker to get the number of spinner items
    /// </summary>
    public override nint GetComponentCount(UIPickerView picker)
    {
    return 1;
    }
    
    /// <summary>
    /// called when a row is selected in the spinner
    /// </summary>
    public override void Selected(UIPickerView picker, nint row, nint component)
    {
    SelectedIndex = (int)row;
    if (ValueChanged != null)
    {
    ValueChanged(this, new EventArgs());
    }
    
    }
    } [enter image description here][1]
    
    
      [1]: https://i.stack.imgur.com/Ld1uU.png
    
    公共类PickerDataModel:UIPickerWebModel
    {
    公共事件处理程序值已更改;
    /// 
    ///要显示在选择器中的项目
    /// 
    公共列表项{get;private set;}
    /// 
    ///当前选定的项目
    /// 
    公共字符串SelectedItem
    {
    获取{返回项目[SelectedIndex];}
    }
    公共整数选择索引
    {
    得到
    {
    返回所选索引;
    }
    设置
    {
    selectedIndex=值;
    }
    }
    私有int-selectedIndex;
    公共PickerDataModel()
    {
    项目=新列表();
    }
    /// 
    ///由选择器调用以确定给定微调器项中有多少行
    /// 
    公共覆盖nint GetRowsInComponent(UIPickerView选择器,nint组件)
    {
    返回项目。计数;
    }
    /// 
    ///由选择器调用以获取特定行中特定行的文本
    ///微调器项目
    /// 
    公共重写字符串GetTitle(UIPickerView选择器、第九行、第九组件)
    {
    返回项目[(int)行];
    }
    /// 
    ///由选择器调用以获取微调器项的数量
    /// 
    公共覆盖nint GetComponentCount(UIPickerView选择器)
    {
    返回1;
    }
    /// 
    ///在微调器中选择行时调用
    /// 
    已选择公共覆盖无效(UIPickerView选择器、第九行、第九组件)
    {
    SelectedIndex=(int)行;
    if(ValueChanged!=null)
    {
    ValueChanged(这是新的EventArgs());
    }
    }
    }[在此处输入图像描述][1]
    [1]: https://i.stack.imgur.com/Ld1uU.png
    

    显示从选择器中选择的数据的文本字段

        private void AddTextField()
        {
            SelectGenderTextField.Placeholder = "Select Gender";
            SelectGenderTextField.Layer.BorderWidth = 1;
            SelectGenderTextField.Layer.BorderColor = UIColor.Black.CGColor;
            SelectGenderTextField.Layer.MasksToBounds = true;
            SelectGenderTextField.Layer.SublayerTransform = CATransform3D.MakeTranslation(5, 0, 0); //to Create a Space At The beginning of the text field
    
    
            SelectGenderTextField.InputView = GenderPicker; //To Start The UIPickerView from The bottom.
    
        }
    
    选择器初始化和设置数据

        private void GenderPicker()
        {
            var genderList = new List<string> {
           "Male","Female"
        };
    
            var picker = new GenderPickerModel(genderList);
    
            GenderPicker.Model = picker;
    
            picker.ValueChanged += (sender, e) => {
    
                SelectGenderTextField.Text = picker.SelectedGenderByUser; //Update The Selected Value In the TextField
    
                View.EndEditing(true);// To Dismiss the Picker View Once The User Select The Value
            };
    
        }
    
    GenderPickerModel类

      private void Constraint()
        {
            View.AddSubviews(SelectGenderTextField);
    
            View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();
    
            View.AddConstraints(
    
    
                SelectGenderTextField.WithRelativeWidth(View, 0.80f),
                SelectGenderTextField.WithRelativeHeight(View, 0.05f),
                SelectGenderTextField.WithSameCenterX(View),
                SelectGenderTextField.WithSameCenterY(View)
    
    
                );
        }
    
    class GenderPickerModel : UIPickerViewModel
    {
        public EventHandler ValueChanged;
        public string SelectedGenderByUser;
        private List<string> genderList;
    
        public GenderPickerModel(List<string> genderList)
        {
            this.genderList = genderList;
        }
    
        public override nint GetRowsInComponent(UIPickerView pickerView, nint component)
        {
            return genderList.Count;
        }
    
        public override nint GetComponentCount(UIPickerView pickerView)
        {
            return 1;
        }
    
        public override string GetTitle(UIPickerView pickerView, nint row, nint component)
        {
            return genderList[(int)row];
        }
    
        public override void Selected(UIPickerView pickerView, nint row, nint component)
        {
            var gender = genderList[(int)row];
            SelectedGenderByUser = gender;
            ValueChanged(null,null);
        }
    
    
    }
    
    class-GenderPickerModel:UIPickerViewModel
    {
    公共事件处理程序已更改;
    公共字符串SelectedGenderByser;
    私人名单性别主义者;
    公共性别分类模型(列出性别列表)
    {
    this.genderList=性别列表;
    }
    公共覆盖nint GetRowsInComponent(UIPickerView pickerView,nint component)
    {
    返回性别列表。计数;
    }
    公共覆盖nint GetComponentCount(UIPickerView pickerView)
    {
    返回1;
    }
    公共重写字符串GetTitle(UIPickerView-pickerView、nint行、nint组件)
    {
    返回性别列表[(int)行];
    }
    已选择公共覆盖无效(UIPickerView pickerView、第九行、第九组件)
    {
    变量性别=性别列表[(int)行];
    SelectedGenderByser=性别;
    ValueChanged(null,null);
    }
    }
    
    可能重复或整洁的好答案!因为他是新来的,所以我发布了所有相关的代码,这样他就不会面对itI上的其他问题。我发现“不相关的代码”非常有用和重要。我唯一无法使用的是所选项目
      private void Constraint()
        {
            View.AddSubviews(SelectGenderTextField);
    
            View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();
    
            View.AddConstraints(
    
    
                SelectGenderTextField.WithRelativeWidth(View, 0.80f),
                SelectGenderTextField.WithRelativeHeight(View, 0.05f),
                SelectGenderTextField.WithSameCenterX(View),
                SelectGenderTextField.WithSameCenterY(View)
    
    
                );
        }
    
    class GenderPickerModel : UIPickerViewModel
    {
        public EventHandler ValueChanged;
        public string SelectedGenderByUser;
        private List<string> genderList;
    
        public GenderPickerModel(List<string> genderList)
        {
            this.genderList = genderList;
        }
    
        public override nint GetRowsInComponent(UIPickerView pickerView, nint component)
        {
            return genderList.Count;
        }
    
        public override nint GetComponentCount(UIPickerView pickerView)
        {
            return 1;
        }
    
        public override string GetTitle(UIPickerView pickerView, nint row, nint component)
        {
            return genderList[(int)row];
        }
    
        public override void Selected(UIPickerView pickerView, nint row, nint component)
        {
            var gender = genderList[(int)row];
            SelectedGenderByUser = gender;
            ValueChanged(null,null);
        }
    
    
    }