差分

ナビゲーションに移動 検索に移動

Xamairn.iOSでSettingsBundleのDefaultValueが取得できない

1,870 バイト追加, 2021年1月28日 (木) 04:34
ページの作成:「 Xamarin.iOSでSettings Bundleから値を取得しようとすると「DefaultValue」に設定した値ではなく必ずnullが返ってきてしまう。iPad…」


[[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]]

案内メニュー