1

在过去的几天里,我一直在试图找出一种绕过警告的方法:

mvx:警告:8.93 屏蔽了异常 MissingMethodException:在 /Developer/MonoTouch/Source/mono/mcs/ 中的 System.Activator.CreateInstance(System.Type 类型,布尔非公共)[0x00094] 中找不到类型 FCX.iOS.TimesheetView 的默认构造函数/Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Activator.cs:222 中的 System.Activator.CreateInstance(System.Type 类型)[0x00000] 中的 class/corlib/System/Activator.cs:326 Cirrious.MvvmCross.Touch.Views.MvxTouchViewsContainer.CreateView (Cirrious.MvvmCross.ViewModels.MvxViewModelRequest 请求) [0x00000] 在 Cirrious.MvvmCross.Touch.Views.MvxCanCreateTouchViewExtensionRequestMethods.CreateViewControllerFor (IMvxCanCreateTouchView 视图, Cirrious.MvvmCross.ViewModels.MvxViewModel请求)[0x00000] in :0 at Cirrious .MvvmCross.Touch.Views.Presenters。MvxTouchViewPresenter.Show (Cirrious.MvvmCross.ViewModels.MvxViewModelRequest 请求) [0x00000] in :0 at Cirrious.MvvmCross.Touch.Views.MvxTouchViewDispatcher+<>c__DisplayClass4.b__3 () [0x00000] in :0 at Cirrious.CrossCore.Core.MvxMainThreadDispatcher .ExceptionMaskedAction (System.Action 动作) [0x00000] in :0

看起来导航正在寻找这个构造函数:

    public TimesheetView ()
    {
    }

当我希望它使用此构造函数时(用于情节提要):

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

我一直在尝试将一个视图中的按钮绑定到以下 ICommand:

    private MvxCommand _NewTimesheetCommand;
    public ICommand NewTimesheetCommand
    {
        get
        {
            _NewTimesheetCommand =  _NewTimesheetCommand ?? new MvxCommand(() => {
                ShowViewModel<TimesheetViewModel>(new TimesheetViewModel.Parameters { Mode = TimesheetViewModel.ModeEnum.ADD });
            });
            return _NewTimesheetCommand;
        }
    }

在查看了许多 StackOverFlow 问题之后,我遇到了这个问题,但听起来使用故事板几乎需要我使用 segues(换句话说,没有办法使用 ICommand 来改变我的视图)。

MvvmCross 是否支持故事板

我的主要问题:是否可以使用情节提要并使用视图模型更改视图?(而不是使用视图中的segues)

4

2 回答 2

2

嗯,我刚刚实现了斯图尔特所说的。效果很好。(请记住,在视图模型中使用 ShowViewModel 进行导航时,segue 是无用的)

using System;
using Cirrious.MvvmCross.Touch.Views.Presenters;
using MonoTouch.UIKit;
using MonoTouch.Foundation;     
using Cirrious.MvvmCross.Touch.Views;
using Cirrious.MvvmCross.ViewModels;

 namespace DigitalCatalog.UI.Touch
 {
   public class StoryBoardTouchViewPresenter : MvxTouchViewPresenter
  {
    public static UIStoryboard Storyboard = null;


    public StoryBoardTouchViewPresenter (UIApplicationDelegate applicationDelegate, UIWindow window, string storyboardName, NSBundle StoryboardBundleOrNull = null) : base(applicationDelegate, window)
    {
        Storyboard = UIStoryboard.FromName (storyboardName, StoryboardBundleOrNull);
    }

    public override void Show (IMvxTouchView view)
    {
        MvxViewController sbView = null;

        try{
            sbView = (MvxViewController) Storyboard.InstantiateViewController (view.Request.ViewModelType.Name.Replace("Model", ""));
        }catch(Exception e){
            Console.WriteLine ("Failed to find storyboard view, did you forget to set the Storyboard ID to the ViewModel class name without the Model suffix ?" + e);
        }

        sbView.Request = view.Request;

        base.Show (sbView);
    }

}
 }

您现在要做的就是像这样设置 AppDelegate :

public override void FinishedLaunching (UIApplication application)
    {


        StoryBoardTouchViewPresenter sbPresenter = new StoryBoardTouchViewPresenter(this, Window,"MainStoryboard_iPad");


        var setup = new Setup(this,sbPresenter);
        setup.Initialize();

        var startup = Mvx.Resolve<IMvxAppStart>();
        startup.Start();


        sbPresenter.MasterNavigationController.NavigationBar.Translucent = false;

        sbPresenter.MasterNavigationController.SetNavigationBarHidden(false, false);

    }

最后记住为故事板中的每个视图设置一个带有视图“类名”的故事板 ID!!!!遗憾的是,没有任何其他方法可以使用 UIStoryboard 类获取视图,您只能使用 Storyboard Ids 获取它

于 2013-12-19T21:41:05.687 回答
0

有一些方法可以加载 `UiViewController. 从情节提要 - 例如,查看没有 Segue 的情节提要的加载视图表单

如果你想在 mvvmcross 中使用这个自定义加载,那么你可以覆盖它IMvxTouchViewCreator以便它使用这种故事板加载,或者你可以覆盖它presenter以便它直接加载故事板视图。

但总的来说,如果你以这种方式工作,感觉就像你在与故事板作斗争——几乎所有的故事板导航似乎都是基于 segue 的。考虑到这一点,您可以做的另一件事是实现自定义演示者并让该演示者将 ShowViewModel 请求转换为performSegueWithIdentifier调用。

于 2013-06-22T07:06:46.827 回答