NSUserDefaults 不保存 StandardUserDefaults 值

NSUserDefaults not saving StandardUserDefaults values

我有一个使用 Microsoft 的 Xamarin 开发的 iOS 应用程序,这就是为什么这些代码中的一些看起来可能不同的原因。无论如何,这就是我想要做的:

在我的应用程序中,我有一组默认用户设置,无论如何都需要在应用程序的每个实例中使用。这是使用此方法设置的:

    public static void SetDefaults()
    {
        var keys = new object[]
        {
            "LastNotificationTime",
            "LastSyncTime",
            "LunchStartTime",
            "LunchEndTime",
            "OnLunchBreak",
            "PunchedIn",
            "PunchTime",
            "ShowDetailPane",
            "NotifyEmergency",
            "RunAtBoot",
            "RowsPerPage",
            "SyncInterval"
        };
        var values = new object[]
        {
            "",
            "",
            "",
            "",
            false,
            false,
            "",
            true,
            true,
            false,
            5,
            60
        };
        var defaults = NSDictionary.FromObjectsAndKeys(values, keys);
        NSUserDefaults.StandardUserDefaults.RegisterDefaults(defaults);
        NSUserDefaults.StandardUserDefaults.Synchronize();
    }

在我申请的初始 运行 期间,这非常有效。我将从头开始在我的设备上部署 运行 应用程序,然后停止。然后我将重新部署已安装的应用程序。我不想每次都清除默认值并设置真正的默认值,所以我在这样做之前执行此检查(在本例中,Settings.GetPreferences() returns NSUserDefaults.StandardUserDefaults 对象) :

    if( Settings.GetPreferences().IntForKey("RowsPerPage") == 0 || 
        Settings.GetPreferences().IntForKey("RowsPerPage") == null )
    {
        Settings.SetDefaults();
    }

正如您在上面看到的,RowsPerPage 最初设置为 5。我希望在后续初始安装后的每个 运行 中,这个值都保持为 5。或者用户选择的任何值,因为那很重要。

然而,上面的检查总是结果为真,我的 SetDefaults() 方法被调用,清除了用户在最后 运行 期间对其默认值所做的任何更改。有谁知道为什么会这样?设置这些默认值时我做错了什么吗?即使添加了不推荐的、已弃用的 NSUserDefaults.StandardUserDefaults.Synchronize() 方法调用,默认值仍会重置。

您的问题是 RegisterDefaults 与您认为的不一样:

来自documentation

The contents of the registration domain are not written to disk; you need to call this method each time your application starts.

如果您想为持续存在的默认值建立初始值,那么您将需要对 SetDefaults 方法中的每个值进行单独的 set 操作,而不是使用 RegisterDefaults