Maui中iOS返回时NavigationPage的NavigatedTo事件不触发
针对你遇到的iOS平台点击NavigationPage返回按钮时,上一页NavigatedTo事件不触发的问题,给你几个可行的解决思路:
1. 监听NavigationPage的Popped事件
在导航容器初始化的代码里(比如App.xaml.cs)订阅Popped事件,当页面被弹出时,取导航栈的最后一项更新CurrentPage,同时过滤掉你不想算作当前页面的子页面:
var navPage = new NavigationPage(new MainPage()); navPage.Popped += (sender, e) => { var currentPage = navPage.Navigation.NavigationStack.LastOrDefault(); // 过滤排除的子页面类型 if (currentPage != null && !(currentPage is ExcludedSubPage)) { if (currentPage.BindingContext is BaseViewModel vm) { vm.CurrentPage = currentPage; } } };
2. 给iOS平台自定义导航返回按钮
通过MAUI的Handler自定义iOS导航栏返回按钮,点击时手动触发上一页的逻辑或者直接更新CurrentPage:
// 在BasePage构造函数中添加平台专属逻辑 #if IOS this.HandlerChanged += (sender, e) => { if (this.Handler?.PlatformView is UIKit.UIViewController vc) { var backButton = new UIKit.UIBarButtonItem("返回", UIKit.UIBarButtonItemStyle.Plain, async (s, args) => { await Navigation.PopAsync(); var prevPage = Navigation.NavigationStack.LastOrDefault(); if (prevPage != null && !(prevPage is ExcludedSubPage)) { // 手动触发原NavigatedTo逻辑 ((BasePage)prevPage).BasePage_NavigatedTo(prevPage, new NavigatedToEventArgs(false)); } }); vc.NavigationItem.LeftBarButtonItem = backButton; } }; #endif
3. 改用页面的Appearing事件替代NavigatedTo
iOS返回时上一页的Appearing事件会正常触发,你可以把原来的NavigatedTo逻辑迁移到这个事件里,同时加个判断确保是导航栈的当前页面:
// 在BasePage构造函数中替换事件订阅 this.Appearing += BasePage_Appearing; // 事件处理方法 private void BasePage_Appearing(object sender, EventArgs e) { if (Navigation.NavigationStack.LastOrDefault() == this && !(this is ExcludedSubPage)) { ViewModel.CurrentPage = this; } }
如果用的是Shell导航,还可以监听Shell.Navigated事件,这个事件在iOS返回时也会触发,能更精准地获取当前活跃页面。
内容的提问来源于stack exchange,提问作者Holunk
相关产品推荐
相关产品推荐

