Подтвердить что ты не робот

Поддержка MVVMCross для раскадровки Xamarin.iOS

С поддержкой интеграции XS раскадровки iOS, посвященной созданию стабильного потока, я бы с удовольствием использовал эту функцию совместно с MVVMCross.

По сути, это похоже на то, что он не должен работать, так как раскадровки указывают навигационную иерархию в проекте представления, а не проект viewmodel, такой как MVVMCross.

Но было бы замечательно, если бы был способ сделать работу 2 совместной.

Кто-нибудь знает, как это может быть достигнуто?

Приветствия, Тристан

4b9b3361

Ответ 1

Существует, по крайней мере, один опубликованный образец, показывающий использование раскадровки - довольно странно названный eh - https://github.com/slodge/eh

Этот образец работал:

Используя такие подходы, довольно легко добавить привязку данных Mvx к приложению, которое в основном управляется раскадрой.


В качестве альтернативы, если разработчики предпочли бы, чтобы навигационная система Mvx ShowViewModel управляла потоком экранов, но также предпочла бы, чтобы эти экраны были разработаны в раскадровке, тогда это возможно, разработав нормальное приложение MvvmCross, но используя пользовательский Presenter, который загружает ViewControllers из раскадровки.

В v3.1.1 из MvvmCross вы можете сделать это на уровне ViewsContainer:

  • переопределить класс MyContainer из MvxTouchViewsContainer.cs
  • переопределить метод protected virtual IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request) - см. https://github.com/MvvmCross/MvvmCross/blob/b8545752f28f4e569efeaa397c3085b0373e4d8b/Cirrious/Cirrious.MvvmCross.Touch/Views/MvxTouchViewsContainer.cs#L40
  • в этом переопределении загрузите ViewControllers на основе раскадровки:

     protected override IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request)
     {
         return (IMvxTouchView)UIStoryboard.FromName("MyStoryBoard", null)
                                           .InstantiateViewController(viewType.Name);
     }
    
  • создайте MyContainer во время Setup -

    protected override IMvxTouchViewsContainer CreateTouchViewsContainer()
    {
        return new MyContainer();
    } 
    
  • который должен тогда работать...

Ответ 2

В большом проекте сохранение всех видов в одной раскадровке может быть сложным.

Я предпочитаю создавать одну раскадровку для каждого вида; Я изменил Контейнер в ответе Стюарта, чтобы найти раскадровку, соответствующую классу вида, и вернуться к основной раскадровке, если не найден:

public class StoryBoardContainer : MvxTouchViewsContainer
{
    protected override IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request)
    {
        UIStoryboard storyboard;
        try
        {
            storyboard = UIStoryboard.FromName(viewType.Name, null);
        }
        catch (Exception)
        {
            storyboard = UIStoryboard.FromName("StoryBoard", null);
        }
        return (IMvxTouchView) storyboard.InstantiateViewController(viewType.Name);
    }
}

Предостережение 1: Чтобы создать экземпляр viewcontrollers таким образом, вы должны установить идентификатор раскадровки в редакторе:

Storyboard ID

Caveat 2: Убедитесь, что ваши представления, наследующие MvxViewController, имеют конструктор public MyView(IntPtr handle) : base(handle), поскольку это используется для создания экземпляров контроллеров представления из раскадровки.

Ответ 3

Поддержка раскадровки теперь является частью MvvmCross. Используйте один подход ViewController для раскадровки, как описано в ответе Geir, установив идентификатор раскадровки и украсив частичные классы MvxViewController с помощью [MvxFromStoryboard]. См. Пример кода в блоге .