You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI中在ContentPage内获取UINavigationItem添加原生导航栏按钮遇阻

解决MAUI iOS标题栏添加原生按钮不生效的问题

问题根源

  1. ViewController获取错误:Platform.GetCurrentUIViewController()返回的是Shell的根ViewController,而非当前页面所在导航控制器对应的ViewController,因此修改它的NavigationItem不会作用于页面标题栏。
  2. 时机不对:OnAppearing触发时导航栏可能尚未完全初始化,后续Shell的初始化逻辑会覆盖你设置的属性。
  3. AppShell导航栏管理机制:使用AppShell时,标题栏由Shell的ShellSectionRenderer统一管理,直接修改页面ViewController的NavigationItem会被Shell的默认设置覆盖。

解决方案一:修正页面内的平台代码

修改MainPage的OnAppearing方法,使用正确的ViewController获取方式,并延迟执行确保UI初始化完成:

protected override void OnAppearing()
{
    #if IOS
    // 延迟执行确保导航栏已就绪
    Dispatcher.Dispatch(async () =>
    {
        await Task.Delay(100);
        var currentViewController = Platform.GetUIViewController(this);
        if (currentViewController?.NavigationItem == null) return;
        
        // 创建原生按钮
        var settingsButton = new UIBarButtonItem(
            UIImage.GetSystemImage("gearshape"), 
            UIBarButtonItemStyle.Plain, 
            (sender, args) =>
            {
                // 按钮点击逻辑,示例:跳转到设置页
                Navigation.PushAsync(new SettingsPage());
            })
        {
            Title = "Settings"
        };
        
        // 应用标题栏设置
        currentViewController.NavigationItem.Title = "TEST!!";
        currentViewController.NavigationItem.SetRightBarButtonItems([settingsButton], true);
    });
    #endif
    base.OnAppearing();
}

解决方案二:自定义ShellRenderer(适用于AppShell场景)

如果使用AppShell,推荐通过自定义ShellRenderer来直接控制导航栏,避免被Shell默认逻辑覆盖:

  1. 在iOS项目中创建自定义渲染器类:
[assembly: ExportRenderer(typeof(AppShell), typeof(CustomShellRenderer))]
namespace YourAppNamespace.iOS.Renderers;

public class CustomShellRenderer : ShellRenderer
{
    protected override IShellSectionRenderer CreateShellSectionRenderer(ShellSection shellSection)
    {
        var sectionRenderer = base.CreateShellSectionRenderer(shellSection) as ShellSectionRenderer;
        if (sectionRenderer == null) return base.CreateShellSectionRenderer(shellSection);
        
        // 创建设置按钮
        var settingsButton = new UIBarButtonItem(
            UIImage.GetSystemImage("gearshape"), 
            UIBarButtonItemStyle.Plain, 
            (sender, args) =>
            {
                // 按钮点击逻辑
                Shell.Current.Navigation.PushAsync(new SettingsPage());
            })
        {
            Title = "Settings"
        };
        
        // 配置导航栏
        sectionRenderer.NavigationController.NavigationBar.TopItem.Title = "TEST!!";
        sectionRenderer.NavigationController.NavigationBar.TopItem.RightBarButtonItems = new[] { settingsButton };
        
        return sectionRenderer;
    }
}
  1. 确保AppShell的导航栏可见(AppShell.xaml中设置):
<Shell 
    x:Class="YourAppNamespace.AppShell"
    Shell.NavBarIsVisible="True">
    <!-- 你的Shell内容 -->
</Shell>

内容的提问来源于stack exchange,提问作者user2950509

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:37:46