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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:15:00