Xamarin.ios Mvvmcross-容器UIViewController

Xamarin.ios Mvvmcross-容器UIViewController,xamarin.ios,mvvmcross,Xamarin.ios,Mvvmcross,我正在尝试实现一个自定义UIViewController类,它将充当我的导航控制器,而不是使用默认的导航控制器。以下是我的容器类别: 在此处输入代码公共部分类容器视图:MvxViewController { 静态布尔用户接口IDIOMISPHONE{ 获取{return UIDevice.CurrentDevice.UserInterfaceIdiom==UIUserInterfaceIdiom.Phone;} } private UIViewController _currentVie

我正在尝试实现一个自定义UIViewController类,它将充当我的导航控制器,而不是使用默认的导航控制器。以下是我的容器类别:

在此处输入代码
公共部分类容器视图: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);
    
如果是这种情况,那么实际上只有其中一个显示为RootViewController,并且
\u cv
可能作为未使用的视图控制器的悬空引用

要找到解决方案,请尝试查看
MvxTouchViewPresenter
-您可以全部替换该类(如果您不需要它的任何功能),也可以找到一个虚拟方法来截取/覆盖以捕获所需的变量-源代码是

e、 g.也许像这样的方法会奏效:

    protected override void ShowFirstView(UIViewController viewController)
    {
        _cv = (ContainerView)viewController;
        base.ShowFirstView(viewController);
    }

…但我相信还有很多其他的解决方案。

老兄,你在干什么?你不应该删除你的答案。这是非常糟糕的风格。如果其他人有类似的问题怎么办?这对试图回答你问题的人来说也是非常粗鲁的!