Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MvvmCross迁移导致Xamarin自定义iOS视图演示程序问题_Xamarin_Xamarin.ios_Mvvmcross - Fatal编程技术网

MvvmCross迁移导致Xamarin自定义iOS视图演示程序问题

MvvmCross迁移导致Xamarin自定义iOS视图演示程序问题,xamarin,xamarin.ios,mvvmcross,Xamarin,Xamarin.ios,Mvvmcross,在MVVMCross 5.x中创建CustomIosViewPresenter(MvxIosViewPresenter类型)时,有一个Show覆盖,我可以使用该覆盖获取IMvxIosView,以便使用ViewModel中的PresentationValue更新UIViewController呈现样式 我有这样的代码,它起作用了: // Worked before public override void Show(IMvxIosView view, MvvmCross.ViewModels.Mv

在MVVMCross 5.x中创建
CustomIosViewPresenter
(MvxIosViewPresenter类型)时,有一个
Show
覆盖,我可以使用该覆盖获取
IMvxIosView
,以便使用ViewModel中的PresentationValue更新UIViewController呈现样式

我有这样的代码,它起作用了:

// Worked before
public override void Show(IMvxIosView view, MvvmCross.ViewModels.MvxViewModelRequest request)
{
    if (request.PresentationValues != null)
    {
        if (request.PresentationValues.ContainsKey("NavigationMode") &&
            request.PresentationValues["NavigationMode"] == "WrapInModalWithNavController")
        {
            var vc = view as IModalPresentation;
            vc.ModalPresentationAttribute = new MvxModalPresentationAttribute
            {
            WrapInNavigationController = true,
            ModalPresentationStyle = UIModalPresentationStyle.OverFullScreen,
            ModalTransitionStyle = UIModalTransitionStyle.CoverVertical
            };
        }
    }
    base.Show(view, request);
}
但是在迁移到MvvmCross 7.1之后,旧的覆盖不再工作,我必须使用它,但是没有视图传递到Show覆盖中,我如何获得它? 我在下面尝试了这段代码,但是
view
为空,无法将其转换为IMvxIosView

// Doesn't work now
public override Task<bool> Show(MvxViewModelRequest request)
{
    if (request.PresentationValues != null)
    {
        if (request.PresentationValues.ContainsKey("NavigationMode") &&
            request.PresentationValues["NavigationMode"] == "WrapInModalWithNavController")
        {
            var viewsContainer = Mvx.IoCProvider.Resolve<IMvxViewsContainer>();
            var viewType = viewsContainer.GetViewType(request.ViewModelType);
            var view = viewType as IMvxIosView;
            
            var vc = view as IModalPresentation;
            vc.ModalPresentationAttribute = new MvxModalPresentationAttribute
            {
                WrapInNavigationController = true,
                ModalPresentationStyle = UIModalPresentationStyle.OverFullScreen,
                ModalTransitionStyle = UIModalTransitionStyle.CoverVertical
            };
        }
    }
    return base.Show(request);
}
//现在不工作了
公共覆盖任务显示(MvxViewModelRequest请求)
{
if(request.PresentationValues!=null)
{
if(request.PresentationValues.ContainsKey(“导航模式”)&&
request.PresentationValues[“NavigationMode”]=“WrapInModalWithNavController”)
{
var viewsContainer=Mvx.IoCProvider.Resolve();
var viewType=viewsContainer.GetViewType(request.ViewModelType);
var view=视图类型为IMvxIosView;
var vc=视为演示文稿的视图;
vc.ModalPresentationAttribute=新的MvxModalPresentationAttribute
{
WraPinAvigationController=true,
ModalPresentationStyle=UIModalPresentationStyle.OverFullScreen,
ModalTransitionStyle=UIModalTransitionStyle.CoverVertical
};
}
}
返回基地。显示(请求);
}
我之所以需要它,是因为如果没有这个函数,当我关闭需要它的特殊视图控制器流时,它不会关闭该流中的所有视图控制器,而是一次只关闭其中一个


如果要在模态ViewController中导航,通常使用MvvmCross执行的操作是首先向模态添加一个
MvxModalPresentationAttribute
,该属性将承载导航的其余部分,您可以将
WrapInNavigationController
设置为
true

对于孩子们来说,这只是常规的孩子导航,不需要属性

如果您想控制模式的弹出方式,您可以创建自己的
MvxPresentationHint
并使用
AddPresentationHintHandler
在演示者中注册它

然后,您可以在ViewModel中更改演示文稿调用
NavigationService.ChangePresentation(您的提示)


至于演示提示,它可能只需调用
CloseModalViewControllers
,这可能会满足您的需要。

TLDR:为您的后续开发人员着想,并以正确的方式构建内容

因此,我深入研究了,并能够使用这个新的覆盖CreateOverridePresentationAttributeViewInstance()

我需要request对象来查看表示值,因此我更新了在另一个覆盖之前调用的
Show
函数,如下所示:

MvxViewModelRequest _request;
public override Task<bool> Show(MvxViewModelRequest request)
{
    _request = request;
    return base.Show(request);
}

然后关闭模式是另一个挑战,我能够使用
trycloseviewcontrollersidestack
ChangePresentation
overrides

确定您在这个ViewController上使用了哪些表示属性?你为什么不通过属性来控制演示风格?@Cheesebaron这是我帮助迁移的现有应用程序。因此视图控制器没有属性,我尝试将属性单独添加到流中的视图控制器中,但没有起作用,因为它们的行为不是一组模态。它们作为单独的模态,关闭模态,一次只关闭一个。有没有一种方法可以从特定页面而不是从一开始加载流?不知道你在这里的意思!我能弄明白。我确实很痛苦:D
{
    var view = base.CreateOverridePresentationAttributeViewInstance(viewType);
    if (_request.PresentationValues.ContainsKey("NavigationMode") &&
_request.PresentationValues["NavigationMode"] == "WrapInModalWithNavController")
    {
        var vc = view as IModalPresentation;

        vc.ModalPresentationAttribute = new MvxModalPresentationAttribute
        {
            WrapInNavigationController = true,
            ModalPresentationStyle = UIModalPresentationStyle.OverFullScreen,
            ModalTransitionStyle = UIModalTransitionStyle.CoverVertical
        };
        return vc;
    }                    
    return view;
}