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

Xamarin.Forms中Acr.UserDialogs在iOS设备上出现空对象引用问题排查

解决Xamarin.Forms中Acr.UserDialogs在iOS上的空对象引用错误

我帮你排查出问题所在了——虽然库文档说iOS无需手动初始化,但你调用UserDialogs.Instance的时机太早,再加上iOS平台的初始化逻辑特性,才导致了空引用错误。下面是具体的修复步骤和原因说明:

核心问题:调用时机不对

你在Page1的构造函数里直接调用UserDialogs.Instance.Alert,但在iOS平台上,UserDialogs.Instance需要等到Xamarin.Forms的视图环境完全准备好之后才能被正确实例化。页面构造函数执行时,iOS的UIKit上下文还没完全初始化完成,这时候访问Instance自然会得到空对象。

修复步骤

1. 调整对话框的调用时机

把对话框的调用代码从页面构造函数移到OnAppearing方法中,这个方法会在页面即将显示时触发,此时iOS的环境已经完全就绪:

修改后的Page1.xaml.cs代码:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class Page1 : ContentPage
{
    public Page1 ()
    {
        InitializeComponent ();
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        UserDialogs.Instance.Alert("Demo Dialog", "Dialog", "ok");
    }
}

2. (可选但推荐)添加iOS端显式初始化

虽然文档说iOS不需要手动初始化,但显式调用初始化可以避免自动初始化的时机问题。在iOS的AppDelegate.cs中,LoadApplication之后添加一行初始化代码:

修改后的AppDelegate.cs代码:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    global::Xamarin.Forms.Forms.Init();
    LoadApplication(new App());
    // 显式初始化UserDialogs
    UserDialogs.Init();
    return base.FinishedLaunching(app, options);
}

为什么这样能解决问题?

  • iOS平台的Acr.UserDialogs依赖UIKit的运行环境,OnAppearing方法执行时,页面的视图控制器已经完成初始化,UserDialogs.Instance也能被正确实例化。
  • 显式调用UserDialogs.Init()可以强制库完成内部初始化,不再依赖自动触发的逻辑,进一步避免时机问题。

做完以上修改后,重新编译iOS项目运行,对话框应该就能正常弹出了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:59:54