3

我遇到了一个非常奇怪的问题。我为 iPad 应用程序创建了一个应用程序设置,由于某种原因,该设置默认为 false - 但仅在用户打开设置并观察实际设置之前。在至少被观察一次后,设置将始终返回正确的值,无论是真还是假(如果设置是量子粒子,这对我来说更有意义)。此行为仅发生在设备上,而不发生在模拟器中。此外,当我在设备上以调试模式启动或通过 TestFlight 发布时,它是一致的。

我的设置是在 Root.plist 中定义的,它位于我的客户端解决方案的 Settings.bundle 文件夹中。此文件中定义的所有其他设置都可以正常工作。

由于我无法真正展示 Xamarin 设计器,因此这是来自 Root.plist 的我的 XML:

<dict>
    <key>Title</key>
    <string>Camera Settings</string>
    <key>Type</key>
    <string>PSGroupSpecifier</string>
</dict>
<dict>
    <key>DefaultValue</key>
    <true/>
    <key>Key</key>
    <string>useCameraForScanning</string>
    <key>Title</key>
    <string>Use Camera for Scanning</string>
    <key>Type</key>
    <string>PSToggleSwitchSpecifier</string>
</dict>

这是我的访问器代码:

private const string useCameraForScanningKey = "useCameraForScanning";
private static bool useCameraForScanning = true;
public static bool UseCameraForScanning
{
    get
    { 
        bool useCamera = NSUserDefaults.StandardUserDefaults.BoolForKey(useCameraForScanningKey);
        useCameraForScanning = useCamera;
        return useCameraForScanning; 
    }
    set { NSUserDefaults.StandardUserDefaults.SetBool(value, useCameraForScanningKey); }    
}

整个访问器的断点证明设置被检索为假。我对这个 Root.plist 业务非常陌生,所以我猜我在这里遗漏了一些明显的东西。

提前感谢您提供的任何帮助!

4

2 回答 2

2

请注意,如果此键没有设置,或者它是应用程序的第一次运行,则返回NSUserDefaults.BoolForKey。它解释了你的问题,至少就我理解的问题而言。NOfalse


看看苹果文档

布尔键:

返回与指定键关联的布尔值。

  • (BOOL)boolForKey:(NSString *)defaultName

参数

defaultName: 当前用户的默认数据库中的一个键。

返回值

如果布尔值与defaultName用户默认值相关联,则返回该值。否则,NO返回。

于 2014-01-17T21:46:34.180 回答
0

链接https://makeapppie.com/tag/root-plist/澄清了一点。

许多控件将具有命名不佳的属性默认值。这是设置应用程序中显示的值,而不是默认值的真实值。它将在第一次使用后显示值,但它是出于显示目的而不是价值目的。

这里的解决方案

public static bool? NullableBoolForKey(this NSUserDefaults defaults, string key)
{
    var value = defaults.ValueForKey(new NSString(key));
    return value == null ? (bool?)null : ((NSNumber)value).UInt32Value == 1;
}
于 2017-04-01T20:56:54.430 回答