Как регистрировать значения по умолчанию в MonoTouch?
Я хочу зарегистрировать значения по умолчанию в NSUserDefaults, чтобы пользовательские настройки не возвращали нулевые значения для значений, явно не заданных пользователем, а скорее возвращали значения по умолчанию, указанные в наборе параметров. Я читаю здесь:
Как регистрировать пользовательские значения по умолчанию с помощью NSUserDefaults без перезаписывания существующих значений?
чтобы в applicationDidFinishLaunching выполнялось следующее:
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]];
Как это можно сделать в MonoTouch?
Ответы
Ответ 1
Вы можете попробовать что-то по строкам:
NSUserDefaults.StandardUserDefaults.RegisterDefaults(NSDictionary.FromFile("Defaults.plist"));
(предположим, что вы создали файл Defaults.plist со всеми вашими значениями по умолчанию в! (и это в корне вашего пакета!))
Ответ 2
Я решил это, используя метод, подробно описанный в этом вопросе:
Можете ли вы сделать настройки в Настройке.Бандле по умолчанию, даже если вы не открываете приложение настроек
Я в основном перевел функцию registerDefaultsFromSettingsBundle, указанную там в MonoTouch. Это очень полезная функция, потому что она вызывает registerDefaults для значений по умолчанию, перечисленных в наборе параметров. Это гарантирует, что если пользователь не введет какие-либо значения, то будут возвращены определенные значения по умолчанию, а не нулевые значения. Это можно вызвать из FinishedLaunching из AppDelegate.
Вот версия этой функции MonoTouch:
public static void RegisterDefaultsFromSettingsBundle()
{
string settingsBundle = NSBundle.MainBundle.PathForResource("Settings", @"bundle");
if(settingsBundle == null) {
System.Console.WriteLine(@"Could not find Settings.bundle");
return;
}
NSString keyString = new NSString(@"Key");
NSString defaultString = new NSString(@"DefaultValue");
NSDictionary settings = NSDictionary.FromFile(Path.Combine(settingsBundle,@"Root.plist"));
NSArray preferences = (NSArray) settings.ValueForKey(new NSString(@"PreferenceSpecifiers"));
NSMutableDictionary defaultsToRegister = new NSMutableDictionary();
for (uint i=0; i<preferences.Count; i++) {
NSDictionary prefSpecification = new NSDictionary(preferences.ValueAt(i));
NSString key = (NSString) prefSpecification.ValueForKey(keyString);
if(key != null) {
NSObject def = prefSpecification.ValueForKey(defaultString);
if (def != null) {
defaultsToRegister.SetValueForKey(def, key);
}
}
}
NSUserDefaults.StandardUserDefaults.RegisterDefaults(defaultsToRegister);
}
Я надеюсь, что другие разработчики MonoTouch найдут это полезным.
UPDATE:
В последней версии Xamarin.iOS
этот код генерирует исключение в этой строке:
NSDictionary prefSpecification = new NSDictionary(preferences.ValueAt(i));
Обратите внимание, что это исключение не возникает из-за iOS 8
, а потому, что Xamarin решил сделать конструктор, что код зависит от частного, поэтому требуемый конструктор недоступен для использования. Я решил это путем подклассификации NSDictionary
следующим образом:
public class CustomNSDictionary: NSDictionary
{
public CustomNSDictionary (IntPtr ptr): base(ptr) {}
}
Затем вы можете заменить проблемную строку следующим образом:
CustomNSDictionary prefSpecification = new CustomNSDictionary(preferences.ValueAt(i));