8

NSUserDefaults を使用して Today Extension にデータを保存およびロードすることは可能ですか? 通知センターを閉じると、ウィジェットは終了したアプリのように動作するため、データが失われます。どうすればこの問題を解決できますか?

これは私のコードです:

NSUserDefaults *defaults;

- (void)viewDidLoad {

[super viewDidLoad];

defaults = [NSUserDefaults standardUserDefaults];
NSArray *loadStrings = [defaults stringArrayForKey:@"savedStrings"];

if ([loadStrings objectAtIndex:0] != nil) {
    [display setText:[NSString stringWithFormat:@"%@", [loadStrings objectAtIndex:0]]];
}
if ([loadStrings objectAtIndex:1] != nil) {
    calculatorMemory = [NSString stringWithFormat:@"%@", [loadStrings objectAtIndex:1]].doubleValue;
}

}


- (IBAction)saveData:(id)sender {

NSString *displayString;
NSString *memoryString;

NSArray *saveStrings = [[NSArray alloc] initWithObjects: displayString, memoryString, nil];


defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:saveStrings forKey:@"savedStrings"];
[defaults synchronize];


}
4

5 に答える 5

19

com.* の代わりにアプリ グループ識別子を使用する必要があります。例:

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.company.appgroup"];

データを保存するときは同期することを忘れないでください

[shared synchronize];
于 2014-06-07T21:08:15.900 に答える
2

世界でどのように値を保存して取得するのか疑問に思っている人は、このコードを見てください。

通常のアプリにこれを追加して、好きなものを *.m ファイルに保存します。

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.TodayExtensionSharingDefaults"];

    //save dic
    [shared setObject:dictionary2 forKey:@"dicForTodayWidget"];

    //save array
    [shared setObject:tempArray2 forKey:@"arrayForTodayWidget"];

    //save some value
    [shared setObject:@"1234" forKey:@"myValForTodayWidget"];

    [shared synchronize];

今日のウィジェットで、viewDidLoad の TodayViewController.m の下にこれを追加します。

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.TodayExtensionSharingDefaults"];

    //get dic
    NSMutableDictionary *dictionary = [shared objectForKey:@"dicForTodayWidget"];
于 2014-12-28T21:29:35.233 に答える
1

最初に、両方のターゲット (アプリケーションと拡張機能)に対してアプリ グループを設定する必要があります。

次に、

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.company.myapp"];

いつものように読み書きできるデフォルトオブジェクトを取得します。

デフォルトの変更について通知を受けたい場合はNSUserDefaultsDidChangeNotification、ウィジェット (またはアプリ) で を使用します。

このすべてを説明する段階的なチュートリアルについては、このブログ投稿をご覧ください。

于 2014-06-29T08:40:21.850 に答える
-2

@edukulele 今日 拡張機能とメイン アプリは 2 つのプロセスで実行されます。今日の拡張機能は、NSUserDefaultsDidChangeNotifications を受信できません。MMWormholeを使ってみました。とても良いです。

于 2016-06-22T11:43:28.563 に答える