Xamarin iOS调用SetStatusBarColor出现System.NullReferenceException异常求助
Xamarin.iOS 状态栏颜色修改空引用异常排查修复
根因定位
- 核心问题出在iOS端
ChangeStatusbarIOS类的SetStatusBarColor方法的链式调用上:你在Info.plist中开启了UIApplicationSupportsMultipleScenes多场景支持,iOS 13及以上系统中这种场景下UIApplication.SharedApplication.KeyWindow会返回null,后续直接调用WindowScene、StatusBarManager等属性就会触发空引用异常。 - 次要隐患:方法中未做任何空校验,即使没有开启多场景,在页面生命周期早期(如
OnAppearing刚触发时)窗口、状态栏管理器还未完成初始化,也可能出现空值。 - 额外问题:每次调用方法都会新建一个
UIView添加到窗口上,多次调用后会叠加大量无用视图,占用资源。
修复方案
直接替换iOS项目中的ChangeStatusbarIOS实现代码如下:
[assembly: Dependency(typeof(ChangeStatusbarIOS))] namespace Test.iOS { public class ChangeStatusbarIOS : IStatusBarPlatformSpecific { // 存储已添加的状态栏视图,避免重复创建 private UIView _statusBar; public void SetStatusBarColor(Color color) { // 先清空旧的状态栏视图 _statusBar?.RemoveFromSuperview(); _statusBar = null; // 兼容多场景模式获取正确的Window var window = UIApplication.SharedApplication.ConnectedScenes .OfType<UIWindowScene>() .FirstOrDefault()? .Windows .FirstOrDefault(w => w.IsKeyWindow); // 空值拦截 if (window == null) return; var statusBarManager = window.WindowScene?.StatusBarManager; if (statusBarManager == null) return; // 创建新的状态栏视图 _statusBar = new UIView(statusBarManager.StatusBarFrame); _statusBar.BackgroundColor = color.AddLuminosity(-0.1).ToUIColor(); window.AddSubview(_statusBar); } } }
验证注意事项
修复后无需修改原有Page代码和Info.plist配置,直接运行iOS项目即可,空引用异常会被消除,状态栏颜色修改功能正常生效。
内容的提问来源于stack exchange,提问作者Chim Di Tru
相关产品推荐
相关产品推荐

