2016-04-12 2 views
0

Я обновил старый проект до Xamarin.iOS Unified и MvvmCross 4.1.MvvmCross - Вид не загружен

Когда я запустить приложение, я получаю следующее исключение:

MvvmCross.Platform.Exceptions.MvxException: Просмотр не загружен для MyView

Мои классы похожи:

MyView : MvxViewController<MyViewModel> {} 

MvxViewController<T> : UIViewController, IMvxBindingContextOwner, IUIWrappable 
    where T : ViewModelBase 

ViewModelBase : MvxViewModel {} 

Я подозреваю, что мне не хватает интерфейса или что-то в MyView, чтобы MvvmCross мог работать правильно, но я не уверен, какой интерфейс это может быть.

Я подозреваю это, потому что мне уже пришлось жестко кодировать между отображениями View и ViewModel, чтобы MvvmCross мог найти ViewModel через отражение/автообнаружение, связанные с MyView. То есть до этой ошибки я не смог найти связанную ошибку ViewModel.

Если я создаю приложение MyView IMvxIosView, эта ошибка исчезнет, ​​а затем я получу нулевую ссылку на ViewModel позже в своем коде, поэтому где-то, где не создается экземпляр, где это необходимо. Мое впечатление заключалось в том, что все должны обрабатываться MvvmCross автоматически, но я могу ошибаться.

Я смотрю на образцах, таких как https://github.com/MvvmCross/MvvmCross/wiki/Tip-Calc-A-Xamarin.iOS-UI-project

где TipView содержит

базу
public new TipViewModel ViewModel { 
    get { return (TipViewModel) base.ViewModel; } 
    set { base.ViewModel = value; } 
} 

MyView не имеет никакого такого ViewModel имущества. Что мне не хватает, чтобы иметь доступ к этому?

Код примера TipCalc по-прежнему ссылается на пространство имен Cirrious, поэтому возможно, что все изменилось.

Любые предложения приветствуются. Я новичок в Xamarin и MvvmCross (хотя и опыт разработки Windows/iOS), и у меня возникли проблемы с поиском актуальной документации.

+2

С вашего вопроса не совсем понятно, что вы просите. У вас есть более полный воспроизводимый образец? – Cheesebaron

ответ

0

Попробуйте сделать это:

var vc = this.CreateViewControllerFor(MvxViewModelRequest.GetDefaultRequest(viewModelType);) as MvxViewController; 
    vc.OnViewCreate(); 

vc.OnViewCreate(); должен гарантировать, что Ваш View загружен.

И линия: this.CreateViewControllerFor(MvxViewModelRequest.GetDefaultRequest(viewModelType);) as MvxViewController;

должны убедиться, что ViewController создается с ViewModel уже установлен. Таким образом, вам не нужно устанавливать его вручную.

Этот метод является методом расширения определяется в MvxCanCreateIosViewExtensionMethods класса https://github.com/MvvmCross/MvvmCross/blob/4.0/MvvmCross/iOS/iOS/Views/MvxCanCreateIosViewExtensionMethods.cs

- Edit -

Еще одна вещь, которую я заметил, в примере кода эта строка:

MyView : MvxViewController<MyView> {} 

типа параметр, переданный в MvxViewController<T>, должен быть связан с ViewModel для MyView, а не MyView.Так, например, вы могли бы иметь что-то вроде:

MyViewModel : ViewModelBase {} 

, а затем:

MyView : MvxViewController<MyViewModel> {} 

- ДОПОЛНЕНО -

Вы должны наследовать от существующего MvxViewController снабженным MvvmCross. https://github.com/MvvmCross/MvvmCross/blob/3c735adc534a5df2d4730e9d58a08f7863c30cee/MvvmCross/iOS/iOS/Views/MvxViewController.cs

+0

Спасибо за предложение. Я могу рассматривать представление без проблем, но CreateViewController бросает нулевую ссылку в MvvmCross, и я не вижу, где прямо сейчас, поскольку библиотека упакована. Мне нужно скачать источник, чтобы посмотреть. Это, я думаю, я делаю что-то очень неправильно. Согласно образцам, которые я видел, все это должно работать. – jyoung

+0

Ах ладно. Я заметил что-то еще в коде, который вы предоставили, см. Обновление для моего ответа. – pnavk

+0

Спасибо, что заметили, что на самом деле у меня был MvxViewController с шаблоном ViewModel. Я, должно быть, скопировал его здесь неправильно. Виноват. Исправлен исходный вопрос. – jyoung

0

Реализация IMvxIosView решила эту конкретную ошибку.

Похоже, что MvvmCross не может найти представление, если оно не реализует этот интерфейс.

Теперь я нахожусь на других ошибках.

+1

Вам не нужно реализовывать IMvxIosView на ViewController. Весь ваш ViewController должен наследовать из класса MvxViewController, предоставленного MvvmCross: https://github.com/MvvmCross/MvvmCross/blob/3c735adc534a5df2d4730e9d58a08f7863c30cee/MvvmCross/iOS/iOS/Views/MvxViewController.cs – pnavk

+0

@pnavk, используя встроенный MvxViewController класс в пространстве MvvmCross.iOS.Views работал чудесами. Я не уверен, почему оригинальные разработчики сделали этот другой класс, но он больше не нужен. Если вы ответите ответом, я приму это. – jyoung

+1

Я добавил это как обновление моего ответа. Рад, что у тебя все работает :) – pnavk

Смежные вопросы