5

NSUserDefaultiOS カスタム キーボードにデータを保存する必要があります。開発者ポータルでアプリ グループと資格を正常に作成しましたXCode

UISwitchで値を保存する方法は次のとおりです

- (IBAction)switchAction:(id)sender
{
    [self.defaults setBool:self.myKey.on forKey:@"myValue"];

    [self.defaults synchronize];
}

そして、これがKeyboardViewに値をロードする方法です。

self.defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.mycompany.customkeyboard"];

if([self.defaults boolForKey:@"myValue"])
{
    self.backgroundColor = [UIColor redColor];
}

else
{
    self.backgroundColor = [UIColor blackColor];
}

それは機能せず、値をロードしません。

データを保存およびロードするにはどうすればよいですか?

4

3 に答える 3

4

NSUserDefaultsアプリ グループ内のすべてのアプリケーションで次のようにオブジェクトを初期化すると、データベースが共有されます。

[[NSUserDefaults alloc] initWithSuiteName:@"group identifier"];

各アプリケーションのデータベースからすべてが[NSUserDefaults standardUserDefaults]このデータベースに引き継がれるわけではないことに注意してください。

ドキュメントは、上記のコードのように共有データベースを返す必要があることを示して い[NSUserDefaults standardUserDefaults]ますが、そうではありません。これをバグとして報告しました (rdar://17164758)。

データベースを同期することを忘れないでください。

[yourDefaults synchronize];
于 2014-06-16T14:04:00.177 に答える
2

わかりました、正確な問題があったので、周りを見回しました。私が行ったのは、メインアプリと拡張機能をグループに追加することでした。メインプロジェクト->ターゲット->機能に移動し、次のようにグループを作成します(グループがない場合、またはとにかく作成します):

ここに画像の説明を入力

次に、ターゲットの下の拡張機能 (E) に移動し、再び Capabilities に移動して、次のように拡張機能をグループ (メイン ターゲットに対して行ったのとまったく同じアプリ グループ) に追加します。

ここに画像の説明を入力

次に、両方を実行したら、メイン アプリで何かを追加するたびに、NSUserDefaults の新しいインスタンスを作成しますが、Suitename は以前に作成したグループ名と同じです。このような:

NSArray *testing = @[@"first",@"Second",@"Third"];
NSUserDefaults *userd = [[NSUserDefaults alloc]initWithSuiteName:@"The gouprname I made earlier"];//This is exactly the same as the groupname
[userd setObject:testing forKey:@"ExtensionArray"];//set the object you want to share
[userd synchronize]; //It's a good idea to sync, just to be on the safe side.

拡張機能の ViewController で、同じグループ名を使用しますが、ユーザーの既定値を読み取ります。

NSUserDefaults *sharedD=[[NSUserDefaults alloc]initWithSuiteName:@"Exactly the same groupname that I gave both in the Capabilities and when initialising the userdefault"];
self.testing = [[NSArray alloc]initWithArray:[sharedD arrayForKey:@"ExtensionArray"]];

そして出来上がり!配列があります!Wormhole クラスを使用して、オブジェクトが変更されたときの通知機能を追加することもできるとどこかで読みましたが、それへのリンクが見つかりません。ワームホール クラスをググれば、きっと見つかるはずです。

お役に立てれば幸いです。さらに情報を見つけた場合は、私と共有してください。

于 2015-10-17T23:51:03.670 に答える
0

含まれているアプリから適切なデータをロードできるため、拡張アプリに新しい値を設定すると役立つ場合があります。

[self.defaults setObject:newValue forKey:@"thisKeyIsJustUsedForSyn"]

そして、適切なデータをロードします。

于 2014-06-21T12:30:48.590 に答える