LoginSignup
1
2

More than 5 years have passed since last update.

Xamarin.iOSでPickerViewを描画する方法

Posted at

Xamarin.iOSでPickerViewを描画する方法です。

StoryBoard

iOS DesignerもしくはInterface Builderで、StoryBoardでUIPickerViewを配置して、Identifierをセットします。

コード

ViewController

ViewDidLoadメソッドで、StoryBoardでセットしたUIPickerViewのModelに、これから自分で作るUIPickerDataModelクラスを継承したサブクラスのインスタンスをセットします。

大事なのはUIPickerViewで選択された値をViewControllerで検知しないと、その後の処理で使えないので注意です。そのためにクラスのフィールドに、検知した値をセットする変数を設けておきましょう。

public partial class ViewController : UIViewController
    {
        int selectedItemId;
        protected ViewController(IntPtr handle) : base(handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            // Perform any additional setup after loading the view, typically from a nib.
            // UIPickerViewを生成する
            var pickerDataModel = new pickerDataModel();
            Picker.Model = pickerDataModel;
            pickerDataModel.ValueChanged += (sender, e) =>
            {
                selectedItemId = itemPickerDataModel.SelectedItem.Item1;
            };
        }
    }

UIPickerViewModelのサブクラス

UIPickerViewModelのサブクラスでは必須メソッドの他に、Eventプロパティを設けて、選択されたときに値が変わったことを通知できるようにします。

以下の例ではItemというクラスがあって、ItemIdとItemNameというプロパティがあるということにします。

public class pickerDataModel : UIPickerViewModel
    {
        // プロパティの変更を検知するプロパティ
        public event EventHandler<EventArgs> ValueChanged;
        // Pickerに表示するデータを格納するフィールド
        List<Item> items = new List<Item>();
        // 選択された値を取得するメソッド
        public Tuple<int, string> SelectedItem
        {
            get
            {
                var returnType = new Tuple<int, string>(items[selectedIndex].ItemId, items[selectedIndex].ItemName);
                return returnType;
            }
        }
        int selectedIndex;
        // コンストラクター
        public pickerDataModel()
        {
            items = new List<Item>();
        }
        // カラム数
        public override nint GetComponentCount(UIPickerView pickerView)
        {
            return 1;
        }
        // 行数
        public override nint GetRowsInComponent(UIPickerView pickerView, nint component)
        {
            return items.Count;
        }
        // 文字列取得
        public override string GetTitle(UIPickerView pickerView, nint row, nint component)
        {
            return items[(int)row].ItemName;
        }
        // 選択されたときの挙動
        public override void Selected(UIPickerView pickerView, nint row, nint component)
        {
            selectedIndex = (int)row;
            if (ValueChanged != null)
            {
                ValueChanged(this, new EventArgs());
            }
        }
    }

このサイトを参考にしました。
SIN@SAPPOROWORKSの覚書
あともう1つ参考にしたサイトがあったのですが、失念…探し出せたら再掲します。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2