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

从Xamarin Forms迁移至.NET MAUI后,如何获取当前ViewController

在.NET MAUI中获取当前iOS ViewController的方法

问题背景

迁移Xamarin.Forms到.NET MAUI时,原有的获取当前ViewController的代码失效,需要适配MAUI的窗口结构。

原Xamarin.Forms(iOS)代码

public UIViewController GetCurrentUIController()
{
    UIViewController viewController;
    var window = UIApplication.SharedApplication.KeyWindow;
    if (window == null)
    {
        return null;
    }

    if (window.RootViewController.PresentedViewController == null)
    {
        window = UIApplication.SharedApplication.Windows
                 .First(i => i.RootViewController != null &&
                             i.RootViewController.GetType().FullName
                             .Contains(typeof(Xamarin.Forms.Platform.iOS.Platform).FullName));
    }

    viewController = window.RootViewController;

    while (viewController.PresentedViewController != null)
    {
        viewController = viewController.PresentedViewController;
    }

    return viewController;
}

MAUI适配方案

MAUI中iOS的窗口结构和命名空间有变化,以下是适配后的代码:

public UIViewController GetCurrentViewController()
{
    var window = UIApplication.SharedApplication.ConnectedScenes
        .OfType<UIWindowScene>()
        .FirstOrDefault()?
        .Windows
        .FirstOrDefault(w => w.IsKeyWindow);

    if (window == null)
        return null;

    var rootViewController = window.RootViewController;
    if (rootViewController.PresentedViewController == null)
    {
        // 找到MAUI对应的根ViewController
        window = UIApplication.SharedApplication.ConnectedScenes
            .OfType<UIWindowScene>()
            .SelectMany(scene => scene.Windows)
            .FirstOrDefault(w => w.RootViewController != null && 
                                w.RootViewController.GetType().FullName.Contains(typeof(Microsoft.Maui.Platform.MauiUIViewController).FullName));
    }

    if (window == null)
        return null;

    var currentViewController = window.RootViewController;
    while (currentViewController.PresentedViewController != null)
    {
        currentViewController = currentViewController.PresentedViewController;
    }

    return currentViewController;
}

关键变化说明

  • 窗口获取方式:MAUI中不再直接使用UIApplication.SharedApplication.Windows,而是通过ConnectedScenes获取UIWindowScene,再从中获取窗口,适配iOS 13+的多窗口场景机制。
  • 根控制器类型:原Xamarin.Forms的Xamarin.Forms.Platform.iOS.Platform替换为MAUI的Microsoft.Maui.Platform.MauiUIViewController。
  • 空值判断增强:增加了更多空值检查,避免因多场景导致的空引用异常。

使用方式

和Xamarin.Forms一致,可通过依赖服务在共享项目中调用该iOS平台方法,实现跨平台的ViewController获取逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:22:26