Код выполняется на симуляторе, но не на устройстве

#xamarin #xamarin.ios #mvvmcross

#xamarin #xamarin.ios #mvvmcross

Вопрос:

В привязке для одного из моих ViewControllers у меня есть этот код:

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

Где DateSelectBarItem a UIBarButtonItem .

Это код для конвертера:

 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. вероятно, проблема со связыванием. Убедитесь, что ваш код не связан, добавив дополнительные материалы в LinkerPleaseInclude.cs

2. @Cheesebaron Спасибо, чувак, это было именно так, это фактически решило еще одну проблему, с которой я столкнулся. Пожалуйста, не могли бы вы добавить его в качестве ответа, чтобы я мог принять.

Ответ №1:

Это проблема со связыванием. Обычно, когда что-то работает нормально на симуляторе в режиме отладки и не работает на реальном устройстве. Вероятно, это связано с тем, что процесс компоновки удалил часть вашего кода.

Это вызвано тем, что компоновщик не может определить, когда код используется через отражение, на которое MvvmCross полагается для привязок.

Чтобы намекнуть компоновщику, что код действительно используется, MvvmCross включает LinkerPleaseInclude.cs файл, в который вы можете добавить дополнительные включения, которые используют конструкторы, методы и свойства, которые, как вы ожидаете, будут использоваться в остальной части вашего кода.

Так, например, в вашем случае, описанном выше, DateSelectBarItem имеет свойство TintColor , которое вы используете в своей привязке. Примером добавления подсказки к компоновщику в LinkerPleaseInclude.cs файле может быть:

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

Этого должно быть достаточно, чтобы подсказать компоновщику сохранить TintColor . Вы можете делать аналогичные вещи с конструкторами и методами.