代码在Simulator上执行,但不在Device上执行

时间:2016-09-30 05:47:27

标签: xamarin xamarin.ios mvvmcross

在我的一个ViewControllers的绑定中,我有以下代码:

BindingSet.Bind(DateSelectBarItem)
          .For(v => v.TintColor)
          .To(vm => vm.HasDatesSelected)
          .WithConversion(new DateFilterButtonStateToTintColourConverter());

DateSelectBarItemUIBarButtonItem

这是转换器的代码:

public class DateFilterButtonStateToTintColourConverter : MvxValueConverter<bool, UIColor>
{
    protected override UIColor Convert(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value ? ColourPalette.Orange : ColourPalette.Blue;
    }
}

现在奇怪的是,当我在模拟器上运行它时,我可以看到绑定工作,访问HasDateSelected属性并且转换器的Convert方法运行。

然后我部署到设备,它根本不起作用。事实上,当我调试设备时,代码甚至不执行,也没有命中断点。

1 个答案:

答案 0 :(得分:2)

这是一个链接问题。通常情况下,在调试模式下模拟器上的某些工作正常,并且在实际设备上不起作用。这可能是因为链接过程剥离了一些代码。

这是因为链接器无法检测何时通过反射使用代码,而MvvmCross依赖于这些代码进行绑定。

为了提示实际使用代码的链接器,MvvmCross包含一个LinkerPleaseInclude.cs文件,您可以在其中添加其他包含,这些包含使用您希望在其余部分中使用的构造函数,方法和属性。你的代码。

例如,在上述情况中,DateSelectBarItem有一个属性TintColor,您在绑定中使用它。在LinkerPleaseInclude.cs文件中向链接器添加提示的示例如下:

public void Include(BarItem item)
{
    item.TintColor = Color.Red;
}

这足以提示链接器保留TintColor。你可以用构造函数和方法做类似的事情。