我遇到了一个非常奇怪的问题。我已经为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); }
}
整个访问器中的断点证明该设置被检索为false。我对这个Root.plist业务很新,所以我猜我错过了一些明显的东西。
提前感谢您提供的任何帮助!
答案 0 :(得分:2)
请注意,如果此密钥没有设置或者是第一次运行应用程序,则NSUserDefaults.BoolForKey
会返回NO
或false
。它解释了你的问题,至少就我理解的问题而言。
返回与指定键关联的布尔值。
(BOOL)boolForKey:(NSString *)defaultName
defaultName
:当前用户默认数据库中的一个键。
如果布尔值与用户默认值中的defaultName
相关联,则返回该值。否则,将返回NO
。
答案 1 :(得分: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;
}