下面是Xamarin文档中已经共享的示例代码。
<Picker>
<Picker.ItemsSource>
<x:Array Type="{x:Type x:String}">
<x:String>Baboon</x:String>
<x:String>Capuchin Monkey</x:String>
<x:String>Blue Monkey</x:String>
<x:String>Squirrel Monkey</x:String>
<x:String>Golden Lion Tamarin</x:String>
<x:String>Howler Monkey</x:String>
<x:String>Japanese Macaque</x:String>
</x:Array>
</Picker.ItemsSource>
</Picker>
在iOS 12模拟器中运行此代码时,它可以工作,但是当您点击完成按钮时,所选项目将被更改,并从所选项目中分配给列表中的第4个项目。
例如,如果您从上面的列表中选择“狒狒”并点击“完成”按钮,则所选项目将更改为“金狮Lion猴”。
我不确定该问题是否仅与iOS 12有关。我正在下载以前的版本模拟器以查看。
我已经上载了模拟器here的视频记录,请问是与操作系统相关的问题还是其他问题?
谢谢
答案 0 :(得分:0)
解决方案::如果仍然无法解决问题,则可以使用自定义渲染器,并重写按钮Done
的事件。
在iOS项目中
using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using UIKit;
using Foundation;
using ObjCRuntime;
using CoreGraphics;
[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:titleForRow:forComponent:")]
public string GetTitle(UIPickerView pickerView, nint row, nint component)
{
return Element.Items[(int)row].ToString();
}
[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;
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();
});
toolbar.Items = new UIBarButtonItem[] { done };
}
}
}
}
形式
using System;
using Xamarin.Forms;
namespace app1
{
public class MyPicker:Picker
{
public MyPicker()
{
}
}
}
在xaml中
<local:MyPicker>
<local:MyPicker.ItemsSource>
<x:Array Type="{x:Type x:String}">
<x:String>Baboon</x:String>
<x:String>Capuchin Monkey</x:String>
<x:String>Blue Monkey</x:String>
<x:String>Squirrel Monkey</x:String>
<x:String>Golden Lion Tamarin</x:String>
<x:String>Howler Monkey</x:String>
<x:String>Japanese Macaque</x:String>
</x:Array>
</local:MyPicker.ItemsSource>
</local:MyPicker>
注意:这是一个similar issue,您可以参考
答案 1 :(得分:0)
here(清除模拟器内容)中提到的解决方案有效。
问题出在Xcode模拟器上,不确定是什么原因导致了此问题。