簡體   English   中英

如何將帶有完成按鈕的工具欄添加到UIPickerView?

[英]How to add ToolBar with done button to UIPickerView?

我想在Xamarin.iOS項目中使用UIPickerView。 我需要的UIPicker必須是這樣的(默認情況下隱藏並帶有工具欄和完成按鈕): Xamarin.forms的樣本選取器

這是Xamarin.forms的示例!

我已經看到了所有關於堆棧溢出的問題,這些問題不在我看來,或者不是針對此目的的完整解釋。

為了證明我已經嘗試過創建完成工具欄,這是我的代碼:

public class TestPickerViewController : UIViewController
    {
        PickerModel picker_model;
        UIPickerView picker;

        public TestPickerViewController()

        {
            Title = Texts.Home;
            View.BackgroundColor = UIColor.White;
            this.EdgesForExtendedLayout = UIRectEdge.None;

        }

        public override void DidReceiveMemoryWarning()
        {
            // Releases the view if it doesn't have a superview.
            base.DidReceiveMemoryWarning();

            // Release any cached data, images, etc that aren't in use.
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            List<Object> state_list = new List<Object>();
            state_list.Add("1");
            state_list.Add("2");
            state_list.Add("3");
            state_list.Add("4");
            picker_model = new PickerModel(state_list);

            picker = new UIPickerView();
            picker.Model = picker_model;
            picker.ShowSelectionIndicator = true;



            UIToolbar toolbar = new UIToolbar();
            toolbar.BarStyle = UIBarStyle.Black;
            toolbar.Translucent = true;
            toolbar.SizeToFit();

            UIBarButtonItem doneButton = new UIBarButtonItem("Done", UIBarButtonItemStyle.Done, (s, e) =>
            {
                foreach (UIView view in this.View.Subviews)
                {
                    if (view.IsFirstResponder)
                    {
                        UITextField textview = (UITextField)view;
                        textview.Text = picker_model.values[(int)picker.SelectedRowInComponent(0)].ToString();
                        textview.ResignFirstResponder();
                    }
                }

            });
            toolbar.SetItems(new UIBarButtonItem[] { doneButton }, true);


            View.AddSubviews(picker);

            //How to add toolbar, action for opening toolbar and hide by default the list 
        }

        public override void ViewDidLayoutSubviews()
        {
            base.ViewDidLayoutSubviews();
            View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();

            View.AddConstraints(

                picker.AtTopOf(View, 90),
                picker.AtLeftOf(View, 50),
                picker.WithSameWidth(View).Minus(100)
            );
        }


        private void SetPicker(object sender, EventArgs e)
        {
            UITextField field = (UITextField)sender;
            picker.Select(picker_model.values.IndexOf(field.Text), 0, true);
        }
    }

    public class PickerModel : UIPickerViewModel
    {
        public IList<Object> values;

        public event EventHandler<PickerChangedEventArgs> PickerChanged;

        public PickerModel(IList<Object> values)
        {
            this.values = values;
        }

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

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

        public override string GetTitle(UIPickerView picker, nint row, nint component)
        {
            return values[(int)row].ToString();
        }

        public override nfloat GetRowHeight(UIPickerView picker, nint component)
        {
            return 40f;
        }

        public override void Selected(UIPickerView picker, nint row, nint component)
        {
            if (this.PickerChanged != null)
            {
                this.PickerChanged(this, new PickerChangedEventArgs { SelectedValue = values[(int)row] });
            }
        }
    }

    public class PickerChangedEventArgs : EventArgs
    {
        public object SelectedValue { get; set; }
    }

我知道我必須將工具欄添加到已完成按鈕的某處。 我還需要隱藏默認選擇器並在單擊選擇部分等時顯示列表的操作...

只需將UIToolbar分配給UITextFieldInputAccessoryView屬性即可。 這是一個代碼片段,例如:

UIToolbar toolBar = new UIToolbar(new CGRect(0, 0, 320, 44));
UIBarButtonItem flexibleSpaceLeft = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace,null,null);
UIBarButtonItem doneButton = new UIBarButtonItem("OK",UIBarButtonItemStyle.Done,this, new ObjCRuntime.Selector("DoneAction"));
UIBarButtonItem[] list = new UIBarButtonItem[] { flexibleSpaceLeft, doneButton };
toolBar.SetItems(list, false);

UIPickerView pickerView = new UIPickerView(new CGRect(0, 44, 320, 216));
pickerView.DataSource = new MyUIPickerViewDataSource();
pickerView.Delegate = new MyUIPickerViewDelegate();
pickerView.ShowSelectionIndicator = true;

//Assign the toolBar to InputAccessoryView 
textField.InputAccessoryView = toolBar;

textField.InputView = pickerView;

並執行以下操作:

    [Export("DoneAction")]
    private void DoneAction()
    {
        Console.WriteLine("Your Action!");
    }

它是這樣的:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM