【问题标题】:Using Xamarin, why would my application setting default to false?使用 Xamarin,为什么我的应用程序设置默认为 false?
【发布时间】:2014-02-07 08:17:55
【问题描述】:

我遇到了一个非常奇怪的问题。我已经为 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 业务非常陌生,所以我猜我在这里遗漏了一些明显的东西。

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

【问题讨论】:

    标签: ios ipad xamarin.ios xamarin root.plist


    【解决方案1】:

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


    看看Apple documentation:

    boolForKey:

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

    • (BOOL)boolForKey:(NSString *)defaultName

    参数

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

    返回值

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

    【讨论】:

    • 老实说,我已经阅读了该文档 4 次,但我看不到“BoolForKey 返回 NO 或 false...如果它是应用程序的第一次运行”的位置。然而,我相信你的话,并把错误当作是真的,结果证明你是对的!我为“LaunchedBefore”添加了另一个 DB bool 属性(但不是 Root.plist 支持者),我检查它是否为假。如果是这样,我将 LaunchedBefore 和 UseCameraForScanning 都设置为 TRUE - 问题已解决。谢谢你,你今天教会了我一些有价值的东西!
    • @WilliamSmith,文件没有像你说的那样说明它。我所做的推断是:如果此键没有设置,则返回NOfalse。在第一次运行时不会对此键进行任何设置,因此如果您没有先向其写入内容,它将始终在第一次运行时返回 NOfalse
    【解决方案2】:

    链接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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 2010-09-25
      • 2012-02-13
      • 2017-09-04
      • 2012-10-27
      • 1970-01-01
      相关资源
      最近更新 更多