1,870 バイト追加,
2021年1月28日 (木) 04:34
[[Xamarin.iOS]]でSettings Bundleから値を取得しようとすると「DefaultValue」に設定した値ではなく必ずnullが返ってきてしまう。[[iPad]]の設定画面上ではちゃんと表示されているのにアプリからだとnullが返ってくる。
これは[[Xamarin.iOS]]に限った話ではなく[[Objective-C]]や[[Swift]]でも同様。
この問題を回避するにはアプリ起動時一発目に以下のような[[コード]]を走らせるとよい。
[[ググれ]]ば[[Objective-C]]や[[Swift]]での実装例もでてくる。
<source lang="csharp">
public override void ViewDidLoad()
{
base.ViewDidLoad();
SetDefaultsFromSettingsBundle();
}
void SetDefaultsFromSettingsBundle()
{
var settingsUrl = NSBundle.MainBundle.PathForResource("Settings.bundle/Root.plist", null);
var settingsPlist = new NSDictionary(settingsUrl);
if (settingsPlist == null)
return;
var preferences = settingsPlist["PreferenceSpecifiers"] as NSArray;
if (preferences == null)
return;
var ud = NSUserDefaults.StandardUserDefaults;
foreach (var pitem in NSArray.FromArray<NSDictionary>(preferences))
{
// keyがないのはセパレーター等なのですっ飛ばす
var key = pitem["Key"] as NSString;
if (key == null)
continue;
// 初期値を取得する
var val = pitem["DefaultValue"];
if (val == null)
continue;
// 既存のvalueがnullじゃないのは入力済みなのですっ飛ばす
var cur = ud.ValueForKey(key);
if (cur != null)
continue;
// 明示的に保存する。
ud.SetValueForKey(val, key);
}
// いらない気もするが明示的にフラッシュしとく。
ud.Synchronize();
}
</source>
[[category: Xamarin.iOS]]