我如何直接实例化MvxTableViewController?

时间:2014-04-22 22:12:03

标签: ios xamarin mvvmcross

我想通过点击导航栏上的UIPopoverController来显示UIBarButtonItem。这个UIPopoverController需要一个“ContentViewController”,它是一个带有一些数据绑定的MvxTableViewController。问题是,如果我直接实例化从MvxTableViewController派生的某个类 - 而不是执行ShowViewModel<blah>(),我在覆盖方法ViewDidLoad上的“base.ViewDidLoad”上有一个例外。

我错过了什么?

提前致谢!

编辑:

例如,如果我使用带有UITableView的MvxViewController:

public class Test : MvxViewController
{
    public override void ViewDidLoad()
    {
        View = new UIView() { BackgroundColor = UIColor.White };
        //TableView = new UITableView(new RectangleF(0, 0, 300, 300));
        base.ViewDidLoad();

        var table = new UITableView(new RectangleF(0, 0, 300, 300));
        // ios7 layout
        if (RespondsToSelector(new Selector("edgesForExtendedLayout")))
            EdgesForExtendedLayout = UIRectEdge.None;

        var source = new MvxStandardTableViewSource(table, "TitleText Nome");
        table.Source = source;

        var set = this.CreateBindingSet<Test, Core.ViewModels.FirstViewModel>();
        set.Bind(source).To(vm => vm.Distritos);
        set.Apply();

        table.ReloadData();
    }
}

如果我有,在FirstViewModel的ViewDidLoad上,在构建导航栏时:

  var buttonLocalizacao = new UIBarButtonItem("Localização", UIBarButtonItemStyle.Plain, (s, e) => {

            distritoViewController = new Test();
            nc = new UINavigationController(distritoViewController);
            var distritoPopOver = new UIPopoverController(nc);
            distritoPopOver.ContentViewController = nc;
            distritoPopOver.PopoverContentSize = new SizeF(300, 300);

            distritoPopOver.PresentFromBarButtonItem((UIBarButtonItem)s, UIPopoverArrowDirection.Up, true);

        });

每当我点击UIBarButtonItem“Localização”时,我在Test的“base.ViewDidLoad”上得到一个例外。这有意义吗?

编辑2:

这是我收到的例外情况:

“未处理的例外情况: System.NullReferenceException:未将对象引用设置为对象的实例   在Cirrious.MvvmCross.ViewModels.MvxViewModelLoader.LoadViewModel(Cirrious.MvvmCross.ViewModels.MvxViewModelRequest请求,IMvxBundle savedState)[0x00000] in:0   在Cirrious.MvvmCross.Touch.Views.MvxViewControllerExtensionMethods.LoadViewModel(IMvxTouchView touchView)[0x00000] in:0   在Cirrious.MvvmCross.Touch.Views.MvxViewControllerExtensionMethods +&lt;&gt; c__DisplayClass1.b__0()[0x00000] in:0   在Cirrious.MvvmCross.Views.MvxViewExtensionMethods.OnViewCreate(IMvxView视图,System.Func`1 viewModelLoader)[0x00000] in:0   在Cirrious.MvvmCross.Touch.Views.MvxViewControllerExtensionMethods.OnViewCreate(IMvxTouchView touchView)[0x00000] in:0   在Cirrious.MvvmCross.Touch.Views.MvxViewControllerAdapter.HandleViewDidLoadCalled(System.Object sender,System.EventArgs e)[0x00000] in:0“

1 个答案:

答案 0 :(得分:1)

终于明白了:

而不是:

var buttonLocalizacao = new UIBarButtonItem("Localização", UIBarButtonItemStyle.Plain, (s, e) => {

        distritoViewController = new Test();
        nc = new UINavigationController(distritoViewController);
        var distritoPopOver = new UIPopoverController(nc);
        distritoPopOver.ContentViewController = nc;
        distritoPopOver.PopoverContentSize = new SizeF(300, 300);

        distritoPopOver.PresentFromBarButtonItem((UIBarButtonItem)s, UIPopoverArrowDirection.Up, true);

    });

我必须创建一个独特的ViewModel来保存我的MvxTableViewController(每个MvxTableViewController,或者MvxViewController,需要一个相应的ViewModel?),这意味着,我无法将另一个MvxTableViewController的测试&#34;绑定到另一个,不同,ViewModel(例如FirstViewModel)。 &#34;试验&#34;必须拥有它自己的ViewModel。

因此,最终必须先实例化相应的ViewModel,然后才能使用&#34; CreateViewControllerFor&#34;实例化MvxTableViewController。取代以上&#34;测试&#34;对于&#34; DistritoViewModel&#34;,其余的很简单:

 var buttonLocalizacao = new UIBarButtonItem("Localização", UIBarButtonItemStyle.Plain, (s, e) => {

            if (distritoPopOver == null)
            {
                var viewModel = new DistritoViewModel();
                var secondv = this.CreateViewControllerFor(viewModel) as MvxTableViewController;

                nc = new UINavigationController(secondv);
                distritoPopOver = new UIPopoverController(nc);
                distritoPopOver.PopoverContentSize = new SizeF(300, 300);
            }

            distritoPopOver.PresentFromBarButtonItem((UIBarButtonItem)s, UIPopoverArrowDirection.Up, true);

        });

请记住:保存UIPopoverController的变量distritoPopover必须是一个类变量,或者在UIBarButtonItem中的Action外部实例化,否则它将被垃圾收集并在显示后立即崩溃!

感谢大家提示:)