Xamarin.ios Mvvmcross-容器UIViewController
我正在尝试实现一个自定义UIViewController类,它将充当我的导航控制器,而不是使用默认的导航控制器。以下是我的容器类别:Xamarin.ios Mvvmcross-容器UIViewController,xamarin.ios,mvvmcross,Xamarin.ios,Mvvmcross,我正在尝试实现一个自定义UIViewController类,它将充当我的导航控制器,而不是使用默认的导航控制器。以下是我的容器类别: 在此处输入代码公共部分类容器视图:MvxViewController { 静态布尔用户接口IDIOMISPHONE{ 获取{return UIDevice.CurrentDevice.UserInterfaceIdiom==UIUserInterfaceIdiom.Phone;} } private UIViewController _currentVie
在此处输入代码
公共部分类容器视图:MvxViewController
{
静态布尔用户接口IDIOMISPHONE{
获取{return UIDevice.CurrentDevice.UserInterfaceIdiom==UIUserInterfaceIdiom.Phone;}
}
private UIViewController _currentView;
protected ContainerViewModel ContainerModel
{ get { return base.ViewModel as ContainerViewModel; } }
public ContainerView ()
: base (UserInterfaceIdiomIsPhone ? "ContainerView_iPhone" : "ContainerView_iPad", null)
{
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
var loginView = this.CreateViewControllerFor(ContainerModel.Login) as UIViewController;
ShowViewController(loginView);
// Perform any additional setup after loading the view, typically from a nib.
}
public ContainerView(UIViewController controller)
: base(UserInterfaceIdiomIsPhone ? "ContainerView_iPhone" : "ContainerView_iPad", null)
{
ShowViewController(controller);
}
public void ShowViewController(UIViewController viewController)
{
if (_currentView !=null)
{
RemoveCurrentViewController();
}
AddChildViewController(viewController);
viewController.View.Frame = GetViewFrame();
containerView.AddSubview(viewController.View);
_currentView = viewController;
viewController.DidMoveToParentViewController(this);
}
public void RemoveCurrentViewController()
{
_currentView.WillMoveToParentViewController(null);
_currentView.View.RemoveFromSuperview();
_currentView.RemoveFromParentViewController();
}
public RectangleF GetViewFrame()
{
return containerView.Bounds;
}
}
我的第一次加载没有问题,因为登录视图加载到containerView中,该视图是nib的一个出口。问题在于后续请求我的出口为空。我可能做错了,但我正在尝试在Presenter Show方法中设置viewcontroller,如下所示:
public class MyPresenter: MvxTouchViewPresenter
{
private static ContainerView _cv;
public BlackhawkPresenter(MvxApplicationDelegate appDelegate, UIWindow window)
: base(appDelegate, window)
{
_cv = new ContainerView();
window.RootViewController = _cv;
}
protected override UINavigationController CreateNavigationController(UIViewController viewController)
{
return new BlackhawkNavigationController(viewController);
}
public override void Show(Cirrious.MvvmCross.ViewModels.MvxViewModelRequest request)
{
var viewController = (UIViewController)Mvx.Resolve<IMvxTouchViewCreator>().CreateView(request);
if(request.ViewModelType == typeof(ContainerViewModel))
base.Show(request);
else
_cv.ShowViewController(viewController);
}
}
公共类MyPresenter:MvxTouchViewPresenter
{
专用静态容器视图;
公共BlackhawkPresenter(MVXApplicationLegate appDelegate,UIWindow)
:基本(appDelegate,窗口)
{
_cv=新的ContainerView();
window.RootViewController=\u cv;
}
受保护的覆盖UINavigationController CreateNavigationController(UIViewController viewController)
{
返回新的BlackhawkNavigationController(viewController);
}
公共覆盖无效显示(Cirriary.MvvmCross.ViewModels.MvxViewModelRequest请求)
{
var viewController=(UIViewController)Mvx.Resolve().CreateView(请求);
if(request.ViewModelType==typeof(ContainerViewModel))
显示(请求);
其他的
_cv.ShowViewController(viewController);
}
}
对于show中的else语句,“ViewDidLoad”从不触发,我的outlet为null。我不确定是否还有其他方法可以拦截ShowViewModel调用以在我的容器类的容器视图中显示它。您的代码有点混乱(有点不完整)但我的猜测是,您创建了多个
ContainerView
- 在以下过程中创建的一个:
_cv = new ContainerView();
- 第二个是在
base.Show(request);
\u cv
可能作为未使用的视图控制器的悬空引用
要找到解决方案,请尝试查看MvxTouchViewPresenter
-您可以全部替换该类(如果您不需要它的任何功能),也可以找到一个虚拟方法来截取/覆盖以捕获所需的变量-源代码是
e、 g.也许像这样的方法会奏效:
protected override void ShowFirstView(UIViewController viewController)
{
_cv = (ContainerView)viewController;
base.ShowFirstView(viewController);
}
…但我相信还有很多其他的解决方案。老兄,你在干什么?你不应该删除你的答案。这是非常糟糕的风格。如果其他人有类似的问题怎么办?这对试图回答你问题的人来说也是非常粗鲁的!