我想通过点击导航栏上的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“
答案 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外部实例化,否则它将被垃圾收集并在显示后立即崩溃!
感谢大家提示:)