Я проверил некоторую часть кода на локальном сайте, также обнаружил, что не установил выбранное значение после нажатия кнопки 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];
}
}
}
Эффект:
введите описание изображения здесь