【问题标题】:MvvmCross Xamarin IOS "Could not find view for ViewModel"MvvmCross Xamarin IOS“找不到 ViewModel 的视图”
【发布时间】:2019-02-10 10:27:24
【问题描述】:

我将 Storyboard 与 MvvmCross 和 Xamarin iOS 一起使用。 A 我遇到了异常。这是堆栈跟踪:

{System.Collections.Generic.KeyNotFoundException:找不到 Kosht​​.Core.ViewModels.TutorialViewModel 的视图 在 MvvmCross.Views.MvxViewsContainer.GetViewType (System.Type viewModelType) [0x00081] in :0 在 MvvmCross.Presenters.MvxAttributeViewPresenter.GetPresentationAttribute (MvvmCross.ViewModels.MvxViewModelRequest 请求) [0x0000c] in :0 在 MvvmCross.Presenters.MvxAttributeViewPresenter.Show (MvvmCross.ViewModels.MvxViewModelRequest 请求) [0x00000] in :0 在 MvvmCross.Platforms.Ios.Views.MvxIosViewDispatcher+c__DisplayClass2_0.b__0 () [0x0001d] in :0 在 MvvmCross.Base.MvxMainThreadAsyncDispatcher+c__DisplayClass0_0.b__0 () [0x00000] in :0 在 MvvmCross.Base.MvxMainThreadAsyncDispatcher+c__DisplayClass1_0+d.MoveNext () [0x00011] in :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/class/参考源/mscorlib/system/runtime/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 --- 从先前抛出异常的位置结束堆栈跟踪 --- 在(包装器托管到本机)UIKit.UIApplication.UIApplicationMain(int,string[],intptr,intptr) 在 /Library/Frameworks/Xamarin.iOS.framework/Versions/11.14.0.14/src/Xamarin.iOS 中的 UIKit.UIApplication.Main(System.String[] args,System.IntPtr 主体,System.IntPtr 委托)[0x00005] /UIKit/UIApplication.cs:79 在 /Library/Frameworks/Xamarin.iOS.framework/Versions/11.14.0.14/src/Xamarin.iOS 中的 UIKit.UIApplication.Main (System.String [] args, System.String principalClassName, System.String delegateClassName) [0x0002c] /UIKit/UIApplication.cs:63 在 Kosht​​.iOS.Application.Main (System.String[] args) [0x00001] 在 /Users/vadimkhadyka/Projects/Kosht​​/src/Mobile/Kosht​​.iOS/Main.cs:13 }

我的教程视图:

[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 并从MvxViewController 继承我的TutorialView,一切正常,但对于我的基类,我得到了例外。

【问题讨论】:

  • 我对 MVVMcross 不是很熟悉,但是你不需要为框架放弃某些命名约定来连接视图模型和视图吗?我做出这个假设是因为我没有看到你在任何地方使用 BindingContext
  • @Woj 可能,我没有看到任何命名问题。如果你看到了,欢迎你:)

标签: c# xamarin xamarin.ios mvvmcross


【解决方案1】:

改变这一行

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;

【讨论】:

  • 不。我遇到了一个新错误。 /Users/vadimkhadyka/Projects/Kosht/src/Mobile/Kosht.iOS/Views/TutorialView.cs(26,26): Error CS0311: The type 'Kosht.Core.ViewModels.TutorialViewModel' cannot be used as type parameter 'TViewModel' in the generic type or method 'BaseViewController&lt;TViewModel&gt;'. There is no implicit reference conversion from 'Kosht.Core.ViewModels.TutorialViewModel' to 'MvvmCross.Core.ViewModels.IMvxViewModel'. (CS0311) (Kosht.iOS)TutorialVewModel 继承自 BaseViewModel 继承自 MvxViewModel
  • @Atlantis 尝试将 IMvxViewModel 的命名空间更改为 BaseViewController 中的 MvvmCross.Core.ViewModels 或 MvvmCross.ViewModels。这取决于您使用的基本视图模型
  • 谢谢。您的评论促使我检查用法。并且MvxViewController 是从不同的包中使用的。我删除了MvvmCross.IOS.Support 修复用法,异常消失了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
相关资源
最近更新 更多