MvvmCross迁移导致Xamarin自定义iOS视图演示程序问题
在MVVMCross 5.x中创建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
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;
}