Средство выбора форм Xamarin в IOS не будет переноситься - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь создать настраиваемое средство визуализации в формах Xamarin, чтобы текст в средстве выбора переносился на IOS. Android отлично работает. Из чтения кажется, что мне нужно сделать это с помощью UIPickerViewDelegate. Однако когда я это делаю ... сборщик просто ломается хуже, чем был сломан раньше, и в основном непригоден для использования. Если я использую делегат, то средство выбора работает нормально, но когда вы что-то выбираете. Что-нибудь. Всегда выбирается первый элемент. Выберите 10-й элемент, и пользовательский интерфейс покажет 1-й элемент. Неважно, какой элемент вы выберете. Сборщик почему-то всегда думает, что он первый. Я не сделал ничего намеренно, чтобы повлиять на выбранные элементы. Такое чувство, что я должен делать что-то еще, о чем мне не говорят другие решения.

Вот мой рендерер:

public class CustomPickerRenderer : PickerRenderer {

protected override void OnElementChanged(ElementChangedEventArgs<Picker> e) {
  base.OnElementChanged(e);
  if (Control != null) {
    ((UIPickerView)Control.InputView).Delegate = new CustomPickerViewDelegate();
  }
}

protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) {
  base.OnElementPropertyChanged(sender, e);
  if (e.PropertyName.Equals("itemssource", StringComparison.InvariantCultureIgnoreCase)) {
    ((Control.InputView as UIPickerView).Delegate as CustomPickerViewDelegate).ItemSource = Element.ItemsSource;
  }
}

}

Вот мой UIPickerViewDelegate

public class CustomPickerViewDelegate: UIPickerViewDelegate {

public IList ItemSource { get; set; }

public override UIView GetView(UIPickerView pickerView, nint row, nint component, UIView view) {
  UILabel label = new UILabel();
  label.Text = ItemSource[(int)row].ToString();
  label.Lines = 0;
  label.LineBreakMode = UILineBreakMode.WordWrap;

  return label;
}

public override nfloat GetRowHeight(UIPickerView pickerView, nint component) {
  return 48;
}

}

1 Ответ

0 голосов
/ 15 июля 2020

Я проверил некоторую часть кода на локальном сайте, также обнаружил, что не установил выбранное значение после нажатия кнопки Done. Чтобы решить эту проблему, нам нужно настроить UIToolbar , чтобы переопределить системный.

Кроме того, при прокрутке конца значение не может быть выбрано автоматически. Нам нужно добавить Selected метод переопределения внутри CustomPickerViewDelegate, чтобы установить выбранное значение для Control (UITextField).

Полный код CustomPickerRenderer следующим образом:

[assembly: ExportRenderer(typeof(Picker), typeof(CustomPickerRenderer))]
namespace MonkeyApp.iOS
{
    public class CustomPickerRenderer : PickerRenderer
    {
        List<string> itemList;
        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
            {

                //Control.BackgroundColor = UIColor.Red;

                UITextField textField = Control;
           
                UIPickerView pickerView = textField.InputView as UIPickerView;

                Picker myPicker = Element;
                itemList = myPicker.Items.ToList();

                pickerView.Delegate = new CustomPickerViewDelegate(itemList, textField);

                UIToolbar toolbar = new UIToolbar(new CoreGraphics.CGRect(0,0,UIScreen.MainScreen.Bounds.Size.Width,44));
                UIBarButtonItem spaceItem = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace);
                UIBarButtonItem doneButtonItem = new UIBarButtonItem(UIBarButtonSystemItem.Done);
                doneButtonItem.Clicked += DoneButtonItem_Clicked;
                var bbs = new UIBarButtonItem[] { spaceItem, doneButtonItem };
                toolbar.SetItems(bbs, false);
                Control.InputAccessoryView = toolbar;
            }
        }

        private void DoneButtonItem_Clicked(object sender, EventArgs e)
        {
            Control.ResignFirstResponder();
        }
    }

    internal class CustomPickerViewDelegate : UIPickerViewDelegate
    {
        private List<string> itemList;
        private UITextField textField;

        public CustomPickerViewDelegate(List<string> itemList, UITextField textField)
        {
            this.itemList = itemList;
            this.textField = textField;
        }

        public override UIView GetView(UIPickerView pickerView, nint row, nint component, UIView view)
        {
            UILabel label = new UILabel();
            label.Text = itemList[(int)row];
            label.Lines = 0;
            label.LineBreakMode = UILineBreakMode.WordWrap;

            return label;
        }

        public override nfloat GetRowHeight(UIPickerView pickerView, nint component)
        {
            return 48;
        }

        public override void Selected(UIPickerView pickerView, nint row, nint component)
        {
            textField.Text = itemList[(int)row];
        }
    }
}

Эффект:

введите описание изображения здесь

...