MvvmCross Xamarin IOS "Не удалось найти представление для ViewModel" - PullRequest
0 голосов
/ 05 сентября 2018

Я использую раскадровку с MvvmCross и Xamarin iOS. А я получаю исключение. Вот трассировка стека:

{System.Collections.Generic.KeyNotFoundException: не удалось найти представление для Kosht.Core.ViewModels.TutorialViewModel в MvvmCross.Views.MvxViewsContainer.GetViewType (System.Type viewModelType) [0x00081] в: 0 в MvvmCross.Presenters.MvxAttributeViewPresenter.GetPresentationAttribute (MvvmCross.ViewModels.MvxViewModelRequest request) [0x0000c] в: 0 в MvvmCross.Presenters.MvxAttributeViewPresenter.Show (запрос MvvmCross.ViewModels.MvxViewModelRequest) [0x00000] в: 0 в MvvmCross.Platforms.Ios.Views.MvxIosViewDispatcher + <> c__DisplayClass2_0.b__0 () [0x0001d] в: 0 в MvvmCross.Base.MvxMainThreadAsyncDispatcher + <> c__DisplayClass0_0.b__0 () [0x00000] в: 0 в MvvmCross.Base.MvxMainThreadAsyncDispatcher + <> c__DisplayClass1_0 + d.MoveNext () [0x00011] в: 0 --- Конец стека трассировки от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.AsyncMethodBuilderCore + <> c.b__6_0 (состояние System.Object) [0x00000] в /Library/Frameworks/Xamarin.iOS.framework/Versions/11.14.0.14/src/Xamarin.iOS/mcs referencesource / mscorlib / система / выполнения / compilerservices / AsyncMethodBuilder.cs: 1018 в Foundation.NSAsyncSynchronizationContextDispatcher.Apply () [0x00000] в /Library/Frameworks/Xamarin.iOS.framework/Versions/11.14.0.14/src/Xamarin.iOS/Foundation/NSAction.cs:178 --- Конец стека трассировки от предыдущего местоположения, где было сгенерировано исключение --- at (управляемая оболочкой) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr) в UIKit.UIApplication.Main (аргументы System.String [], руководитель System.IntPtr, делегат System.IntPtr) [0x00005] в /Library/Frameworks/Xamarin.iOS.framework/Versions/11.14.0.14/src/Xamarin.iOS /UIKit/UIApplication.cs:79 в UIKit.UIApplication.Main (System.String [] args, System.String PrincipalClassName, System.String DelegateClassName) [0x0002c] в /Library/Frameworks/Xamarin.iOS.framework/Versions/11.14.0.14/src/Xamarin.iOS /UIKit/UIApplication.cs:63 в Kosht.iOS.Application.Main (System.String [] args) [0x00001] в /Users/vadimkhadyka/Projects/Kosht/src/Mobile/Kosht.iOS/Main.cs:13}

Мой TutorialView:

[MvxViewFor(typeof(TutorialViewModel))]
    [MvxFromStoryboard("Tutorial")]
    [MvxRootPresentation]
    public partial class TutorialView : BaseViewController<TutorialViewModel>
    {
        public TutorialView() : base("TutorialView", null)
        {
        }

        public override void ViewDidLoad()
        {
            base.NavigationController.NavigationBarHidden = true;
            base.ViewDidLoad();
        }
    }

Мой BaseViewController:

    public class BaseViewController<TViewModel> : MvxViewController,  IBaseView<TViewModel> where TViewModel : BaseViewModel
        {
            protected BaseViewController(string nibName, NSBundle bundle) : base(nibName, bundle)
            {
            }

            public BaseViewController(IntPtr handle) : base(handle)
            {
            }

            public BaseViewController()
            {
            }

            public override void ViewDidLoad()
            {
                base.ViewDidLoad();
                // Perform any additional setup after loading the view, typically from a nib.
            }

            public new TViewModel ViewModel => (TViewModel)base.ViewModel;


            public override void DidReceiveMemoryWarning()
            {
                base.DidReceiveMemoryWarning();
                // Release any cached data, images, etc that aren't in use.
            }
}

Если я удаляю BaseViewController и унаследовал свой TutorialView от MvxViewController, все прекрасно работает, но с моим базовым классом я получаю исключение.

1 Ответ

0 голосов
/ 05 сентября 2018

Изменить эту строку

public class BaseViewController<TViewModel> : MvxViewController,  IBaseView<TViewModel> where TViewModel : BaseViewModel

Для

public class BaseViewController<TViewModel> : MvxViewController<TViewModel> where TViewModel : class, IMvxViewModel

И удалите это

public new TViewModel ViewModel => (TViewModel)base.ViewModel;
...