0

ナビゲーション コントローラーでは、ビュー コントローラー 1 からビュー コントローラー 2 に移動します。

ビュー コントローラー 1 は、FetchedResultsController に関連付けられたテーブル ビュー コントローラーです。特定のコンテキストからデータを取得して表示します。次に、行がタップされた場合にコントローラー 2 を表示するようにセグエします。セグエイング中に、View Controller 1 にあるデータを使用して、View Controller 2 の特定の NSManagedObject プロパティを設定しました。

これで、View Controller 2 で NSManagedObject プロパティを使用してデータを表示し、データを変更して保存を実行できるようになりました。View Controller 1 に戻ると、変更が反映されます。ただし、アプリを再起動すると、いずれのビュー コントローラーにも反映されなくなります。

これが私が保存を行う方法です。

- (void)hiddenAttributeSwitchSlid:(UISwitch *)sender
{
    [self.workoutType.managedObjectContext performBlock:^{
        self.workoutType.workoutHiddenByDefault = [NSNumber numberWithBool:sender.isOn];
        NSError *error = nil;
        if (![self.workoutType.managedObjectContext save:&error]) {
            NSLog(@"There was an error in saving to context - %@", [error localizedDescription]);
        }
        else {
            NSLog(@"No error");
        }
    }];
}

ワークアウト タイプは、このビュー コントローラーにセグエする前に、prepareForSegue: で設定される NSManagedObject です。

performBlock: を使用しなくても機能しません。

PS - この種の質問が以前に出されたことは知っています。それらを閲覧しましたが、何も機能していないようです。

4

4 に答える 4

2

モデルのその属性にデフォルト値が設定されていますか?

アプリケーションのバックグラウンド処理中にデフォルト値を持つ属性が数回リセットされる状況 (完全には絞り込んでいません) で、Core Data に特定されたバグがあります。

これをテストする方法は、KVO を介して変更されている値をリッスンし、変更をログに記録してから、テストを複製することです。いくつかの変更が見られる場合は、そのバグが発生していることがわかります。

私が確認した唯一の既知の信頼できる解決策は、デフォルト値を削除することです。デフォルト値が必要な場合は、それをメソッドのNSManagedObjectサブクラスに追加し-awakeFromInsert、検証メソッドを更新してチェックします。私が知っている吸う。

アップデート #2

いくつのコンテキストがありますか?

親子コンテキストを使用していますか?

もしそうなら、一番上の親を保存していますか?

アップデート #3

わかりました、a の中UIManagedDocumentに 2 つのNSManagedObjectContextインスタンスがあります。を使用している理由はありますUIManagedDocumentか? 申請書に複数の文書がありますか? そうでない場合は、従来の Core Data スタックに戻すことを強くお勧めします。はUIManagedDocument、単一のスタック アプリケーションで使用することを意図したものではありません。

直接保存の問題についてはUIManagedDocument、アプリケーションを終了するときにバックグラウンドで保存しようとします。少し時間がかかる場合があり、個人的にはあまり信頼できません。終了時に保存を要求できます。これにより、保存が迅速に行われることが保証されますが、それでも信頼できない場合があります。

どのようにアプリケーションを終了していますか?

Xcodeでそれを殺していますか?

バックグラウンドにしてから再開していますか?

バックグラウンドで実行し、iOS デバイスから強制終了していますか?

の保存をリッスンしてUIManagedDocumentログ ステートメントを出力すると、ディスクへの保存が実際にいつ行われたかを確認できます。これは、保存されている場合と保存されていない場合を正確に絞り込むのに役立つ場合があります。

于 2012-05-10T22:11:13.620 に答える
1

コンテキストの保存を使用すべきではないと思います。ドキュメントは自動保存されます。

ドキュメントの保存時に、データの整合性エラーが発生する可能性があります。コンテキストの保存を使用せず、[self.workoutType.managedObjectContext save:&error]継承された次のクラスを使用して、UIManagedDocument自動保存のログを追加することをお勧めします。

LoggingManagedDocument.h:

@interface LoggingManagedDocument : UIManagedDocument

@end

LoggingManagedDocument.m:

#import "LoggingManagedDocument.h"

@implementation LoggingManagedDocument

- (id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError
{
    NSLog(@"Auto-Saving Document");
    return [super contentsForType:typeName error:outError];
}

- (void)handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted
{
    NSLog(@"error: %@ userInfo: %@", error, error.userInfo);
}

@end

このクラスは、データが保存されない理由を特定するのに役立ちます。属性を変更した後、アプリケーションを実行して 15 ~ 30 秒待つだけで、自動保存が行われます。

ロギングは以下に基づいています: http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

于 2012-05-11T19:52:10.900 に答える
0

ドキュメントを保存する必要があります。

[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
于 2015-03-11T03:29:22.183 に答える