NSUserDefaults不保存StandardUserDefaults值

时间:2018-10-09 20:44:17

标签: c# ios xamarin nsuserdefaults

我有一个使用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()返回NSUserDefaults.StandardUserDefaults对象):

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

从上面可以看到,RowsPerPage最初设置为5。我希望此值在以后的初始安装后每次运行时都保持为5。或者由用户选择,就此而言。

但是,上面的检查总是正确的,并且调用了我的SetDefaults()方法,清除了用户在上一次运行中对其默认值所做的任何更改。有人知道为什么会这样吗?设置这些默认值时我做错什么了吗?即使在添加了不建议使用的不建议使用的NSUserDefaults.StandardUserDefaults.Synchronize()方法调用之后,仍将重置默认值。

1 个答案:

答案 0 :(得分:1)

您的问题是RegisterDefaults并没有按照您的想象做:

documentation

  

注册域的内容未写入磁盘;您需要在每次启动应用程序时调用此方法。

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