从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
相关产品推荐
相关产品推荐

