iOS中如何关闭带MvxSidebarPresentation属性的视图?点击按钮失败
解决MvvmCross侧边栏Root视图无法关闭的问题
你遇到的问题核心在于:ProductsView是通过MvxPanelHintType.ResetRoot标记加载的侧边栏Center面板根视图,而默认的MvxClosePresentationHint只能处理非根级视图的关闭请求,所以才会出现"Hint ignored"和"Could not close ViewModel"的警告。
下面给你两种可行的解决方法:
方法一:在ViewModel中使用侧边栏专用Presentation Hint
修改ProductsViewModel里的CloseViewCommand,替换默认关闭逻辑,发送侧边栏专属的演示提示:
using MvvmCross.Platforms.Ios.Presenters.Sidebar; using MvvmCross.ViewModels; public class ProductsViewModel : BaseViewModel { private readonly IMvxNavigationService _navigationService; public ProductsViewModel(IMvxNavigationService navigationService) { _navigationService = navigationService; } public ICommand CloseViewCommand => new MvxCommand(() => { // 弹出当前Center面板视图,回到之前的根视图(如果存在) _navigationService.SendPresentationHint(new MvxPanelPopPresentationHint(MvxPanelEnum.Center)); // 若要直接重置Center面板到初始状态,可替换为这句: // _navigationService.SendPresentationHint(new MvxResetRootPresentationHint()); }); }
原View中的绑定逻辑无需修改,点击BtnClose时就能触发正确的侧边栏关闭流程。
方法二:在View中直接调用侧边栏控制器API
如果更习惯在视图层处理关闭逻辑,可以直接获取侧边栏父控制器并调用相关方法:
public partial class ProductsView : BaseViewController<ProductsViewModel> { public override void ViewDidLoad() { base.ViewDidLoad(); // 替换原绑定逻辑,直接处理按钮点击 BtnClose.TouchUpInside += OnCloseButtonTapped; } private void OnCloseButtonTapped(object sender, EventArgs e) { // 获取侧边栏父控制器 if (ParentViewController is MvxSidebarViewController sidebarController) { // 弹出当前Center面板视图 sidebarController.PopPanel(MvxPanelEnum.Center); // 若要重置Center面板到初始根视图,可替换为这句: // sidebarController.ResetRootPanel(MvxPanelEnum.Center, null); } } }
这两种方法都能绕过默认关闭逻辑的限制,成功关闭你的ProductsView。
内容的提问来源于stack exchange,提问作者Mustafa
相关产品推荐
相关产品推荐

