Используя Xamarin, почему в моем приложении по умолчанию установлено значение false?
Я сталкиваюсь с действительно странной проблемой. Я создал настройку приложения для приложения iPad, и по какой-то причине настройка по умолчанию имеет значение false, но только до тех пор, пока пользователь не откроет настройки и не увидит фактические настройки. После наблюдения хотя бы один раз, настройка всегда будет возвращать правильное значение, независимо от того, является ли оно истинным или ложным (если бы настройка была квантовой частицей, для меня было бы больше смысла). Такое поведение происходит только на устройстве, а не в симуляторе. Кроме того, это согласуется, когда я запускаю в режиме отладки на устройстве или когда я выпускаю через TestFlight.
Мои настройки определены в Root.plist, который находится в моем клиентском решении в папке Settings.bundle. Все остальные параметры, определенные в этом файле, работают нормально.
Поскольку я не могу показать конструктор Xamarin, вот мой XML из Root.plist:
<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, поэтому я предполагаю, что мне здесь не хватает чего-то очевидного.
Заранее спасибо за любую помощь!
2 ответа
Обратите внимание, что NSUserDefaults.BoolForKey
возвращается NO
или же false
если для этого ключа нет настроек или это первый запуск приложения. Это как бы объясняет твою проблему, по крайней мере, насколько я понял проблему.
Посмотрите документацию Apple:
boolForKey:
Возвращает логическое значение, связанное с указанным ключом.
(BOOL)boolForKey:(NSString *)defaultName
параметры
defaultName
: Ключ в базе данных текущего пользователя по умолчанию.
Возвращаемое значение
Если логическое значение связано с defaultName
в пользовательских значениях по умолчанию это значение возвращается. Иначе, NO
возвращается
Ссылка 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;
}