ios - 未能找到类型 MvxViewModelLoader MvvmCross IOS 的构造函数

标签 ios constructor mvvmcross

我使用 MvvmCross 开发一个 CrossPlatform 应用程序。 我在 Mac 上工作,在构建解决方案时没有出现错误。 当我运行它时......我有这个错误:找不到 Cirrious.MvvmCross.ViewModels.MvxViewModelLoader 类型的构造函数并突出显示 base.ViewDidLoad();

代码:

public partial class MainView : MvxViewController
{
    static bool UserInterfaceIdiomIsPhone {
        get { return UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone; }
    }

    public MainView ()
        : base (UserInterfaceIdiomIsPhone ? "MainView_iPhone" : "MainView_iPad", null)
    {
    }

    public override void DidReceiveMemoryWarning ()
    {
        // Releases the view if it doesn't have a superview.
        base.DidReceiveMemoryWarning ();

        // Release any cached data, images, etc that aren't in use.
    }

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        // Perform any additional setup after loading the view, typically from a nib.
    }

这是默认代码,我只是更改了父类(super class)(UIViewController 到 MvxViewController)

堆栈跟踪:

Failed to find constructor for type Cirrious.MvvmCross.ViewModels.MvxViewModelLoader at Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.IoCConstruct (System.Type type) [0x00000] in :0 at Cirrious.CrossCore.IoC.MvxSimpleIoCContainer+ConstructingResolver.Resolve () [0x00000] in :0 at Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.InternalTryResolve (System.Type type, ResolveOptions resolveOptions, System.Object& resolved) [0x00000] in :0 at Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.InternalTryResolve (System.Type type, System.Object& resolved) [0x00000] in :0 at Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.Resolve (System.Type t) [0x00000] in :0 at Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.Resolve[IMvxViewModelLoader] () [0x00000] in :0 at Cirrious.CrossCore.Mvx.Resolve[IMvxViewModelLoader] () [0x00000] in :0 at Cirrious.MvvmCross.Touch.Views.MvxViewControllerExtensionMethods.LoadViewModel (IMvxTouchView touchView) [0x00000] in :0 at Cirrious.MvvmCross.Touch.Views.MvxViewControllerExtensionMethods+<>c_DisplayClass1.b_0 () [0x00000] in :0 at Cirrious.MvvmCross.Views.MvxViewExtensionMethods.OnViewCreate (IMvxView view, System.Func`1 viewModelLoader) [0x00000] in :0 at Cirrious.MvvmCross.Touch.Views.MvxViewControllerExtensionMethods.OnViewCreate (IMvxTouchView touchView) [0x00000] in :0 at Cirrious.MvvmCross.Touch.Views.MvxViewControllerAdapter.HandleViewDidLoadCalled (System.Object sender, System.EventArgs e) [0x00000] in :0 at (wrapper delegate-invoke) :invoke_void_this__object_EventArgs (object,System.EventArgs) at Cirrious.CrossCore.Core.MvxDelegateExtensionMethods.Raise (System.EventHandler eventHandler, System.Object sender) [0x00000] in :0 at Cirrious.CrossCore.Touch.Views.MvxEventSourceViewController.ViewDidLoad () [0x00000] in :0 at TrainingCatalog.Touch.MainView.ViewDidLoad () [0x00002] in /Users/a_masteruser/Projects/DefaultCollection/_git/HapplyTrainingCatalog/TrainingCatalog.Touch/Views/MainView.cs:30 at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:void_objc_msgSend (intptr,intptr) at MonoTouch.UIKit.UIWindow.MakeKeyAndVisible () [0x00008] in /Developer/MonoTouch/Source/monotouch/src/UIKit/.pp-UIWindow.g.cs:129 at TrainingCatalog.Touch.AppDelegate.FinishedLaunching (MonoTouch.UIKit.UIApplication app, MonoTouch.Foundation.NSDictionary options) [0x0003c] in /Users/a_masteruser/Projects/DefaultCollection/_git/HapplyTrainingCatalog/TrainingCatalog.Touch/AppDelegate.cs:21 at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr) at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/.pp-UIApplication.cs:38 at TrainingCatalog.Touch.Application.Main (System.String[] args) [0x00008] in /Users/a_masteruser/Projects/DefaultCollection/_git/HapplyTrainingCatalog/TrainingCatalog.Touch/Main.cs:17

Failed to find constructor for type Cirrious.MvvmCross.ViewModels.MvxViewModelLoader

最佳答案

根据堆栈跟踪,我猜测失败的行是:https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Touch/Views/MvxViewControllerExtensionMethods.cs#L44

这是在 IoC 中查找已在设置中注册为的类型:

    protected virtual void InitializeViewModelFramework()
    {
        Mvx.RegisterType<IMvxViewModelLoader, MvxViewModelLoader>();
    }

(来自 https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross/Platform/MvxSetup.cs#L192)

查看 MvxViewModelLoader,这是在:https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross/ViewModels/MvxViewModelLoader.cs 中定义的- 所以它应该有一个默认的 public 编译器添加的无参数构造函数......

考虑到这一点......

我猜 Xamarin 可能会从您部署的二进制文件中剥离构造函数。这可能是因为您的链接器设置 - 所以请检查您是否已将链接器设置为链接“仅 SDK”。但如果这没有帮助,那么这可能归结为某些 Xamarin 优化/功能 - 所以您可能需要。

作为一种简单的解决方法,您可以尝试覆盖安装程序以便您使用:

    protected override void InitializeViewModelFramework()
    {
        Mvx.RegisterSingleton<IMvxViewModelLoader>(() => new MvxViewModelLoader>());
    }

但是,即使这有效,我也担心链接器可能会删除您应用中的其他符号 - 所以这可能还不够......您可能需要使用 Xamarin 来解决这个问题。

关于ios - 未能找到类型 MvxViewModelLoader MvvmCross IOS 的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21187052/

相关文章:

objective-c - iOS App在调用方法时等待HTTP响应?

xamarin - 什么时候会使用非通用版本的 MvxAppCompatSetup<T>?

ios - 如何使用 Swift-2 过滤大型数组以获得高性能

ios - 这行在 Swift 中意味着什么?

java - 调用构造函数时收到错误

Javascript - 对象不是构造函数

c++ - 显式使用 main 中的构造函数调用作为函数调用参数

android - MvxTimePicker 不会绑定(bind)到 TimeSpan

sqlite - MvvmCross、SQLite、商店应用程序?

ios - Facebook Graph 请求无法在 iOS 9.2 中检索电子邮件 - xCode 7