Как я могу установить и получить выбранное значение в моем пользовательском средстве выбора? Значение не изменяется - PullRequest
0 голосов
/ 05 января 2019

Как я могу получить выбранный пункт моего пользовательского выбора? Он всегда возвращается в исходное состояние "Sonstige" (= "Other"). Таким образом, значение не подлежит изменению.

Я часами сталкиваюсь с проблемой, но понятия не имею, как ее исправить. Я новичок в пользовательском рендеринге.

Я хотел бы использовать функцию DoneBtn_Clicked, чтобы установить новое значение для выбора:

void DoneBtn_Clicked(object sender, EventArgs e){}

Снимок экрана пользовательского средства выбора:

screenshot


Мой код:

Class PickerRendererIos.cs :

    [assembly: ExportRenderer(typeof(MyPickerRenderer), typeof(PickerRendererIos))]

    namespace DigitalNatives.iOS
    {

    public class PickerRendererIos : PickerRenderer, IUIPickerViewDelegate
    {
        IElementController ElementController => Element as IElementController;

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Picker> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                UIPickerView pickerView = (UIPickerView)Control.InputView;
                pickerView.WeakDelegate = this;
                pickerView.BackgroundColor = UIColor.White; //set the background color of pickerview

            }

        }


        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            Control.Layer.BorderWidth = 1;
            Control.BorderStyle = UITextBorderStyle.Line;
            Control.TextColor = UIColor.Blue;
        }

        [Export("pickerView:viewForRow:forComponent:reusingView:")]

        public UIView GetView(UIPickerView pickerView, nint row, nint component, UIView view)
        {

            UILabel label = new UILabel
            {
                TextColor = UIColor.Blue,
                Text = Element.Items[(int)row].ToString(),
                TextAlignment = UITextAlignment.Center,
            };
            var picker = this.Element;
            return label;
        }

    }
}

1 Ответ

0 голосов
/ 07 января 2019

Причина:

Поскольку вы установили delegate окна выбора pickerView.WeakDelegate = this;. Но вы не реализовали весь метод в делегате.

Решение:

Вы можете переопределить действие нажатия кнопки Done. Ссылаться на следующий код

в пользовательском рендерере

[assembly: ExportRenderer(typeof(MyPicker), typeof(MyPickerRenderer))]
namespace xxx.iOS
{
   public class MyPickerRenderer:PickerRenderer,IUIPickerViewDelegate,IUIPickerViewDataSource
   {

    string SelectedValue;

    public MyPickerRenderer()
    {
    }

    public nint GetComponentCount(UIPickerView pickerView)
    {
        return 1;
    }

    public nint GetRowsInComponent(UIPickerView pickerView, nint component)
    {
        return Element.Items.Count;
    }

    [Export("pickerView:viewForRow:forComponent:reusingView:")]
    public UIView GetView(UIPickerView pickerView, nint row, nint component, UIView view)
    {

        UILabel label = new UILabel
        {
            TextColor = UIColor.Blue,
            Text = Element.Items[(int)row].ToString(),
            TextAlignment = UITextAlignment.Center,
        };
        var picker = this.Element;
        return label;
    }

    [Export("pickerView:didSelectRow:inComponent:")]
    public void Selected(UIPickerView pickerView, nint row, nint component)
    {
        Control.Text = Element.Items[(int)row];
        SelectedValue= Element.Items[(int)row]; 
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
    {
        base.OnElementChanged(e);

        if(Control!=null)
        {
            SelectedValue = Element.Items[0];

            UIPickerView pickerView = (UIPickerView)Control.InputView;
            pickerView.WeakDelegate = this;
            pickerView.DataSource = this;

            // get the button Done and rewrite the event
            UIToolbar toolbar = (UIToolbar)Control.InputAccessoryView;

            UIBarButtonItem done = new UIBarButtonItem("Done", UIBarButtonItemStyle.Done, (object sender, EventArgs click) =>
                {
                    Control.Text = SelectedValue;
                    toolbar.RemoveFromSuperview();
                    pickerView.RemoveFromSuperview();
                    Control.ResignFirstResponder();
                });

            UIBarButtonItem empty = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace, null);

            toolbar.Items = new UIBarButtonItem[] { empty,done };
        }

    }

  }
}
...