Xamarin Picker View无效选择iOS 12

时间:2018-12-04 10:42:04

标签: ios xamarin xamarin.forms xamarin.ios ios12

下面是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的视频记录,请问是与操作系统相关的问题还是其他问题?

谢谢

2 个答案:

答案 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模拟器上,不确定是什么原因导致了此问题。