3

これがどれほど複雑になるかわかりませんが、

CoreDataを使用するアプリがあります。

新しい管理対象オブジェクトを作成するときは、そのフィールドにplistに設定されたデフォルト値を入力します。

次に、一連のフォームを表示します(保存された値をフォームにロードし、オブジェクトの値を更新します)。

そして最後に、オブジェクトにChangesがあるかどうかを確認し、オブジェクトを保存することを提案します。

この部分は正常に機能します。

ただし、ユーザーがインターフェイスで[戻る]を押したときに問題が発生した場合。ユーザーがオブジェクト内の何かを変更した場合にアラートを表示できるようにしたい、または何も変更されていない場合にユーザーを元に戻せるようにしたい。

hasChangesを使用しますが、オブジェクトにデフォルトデータを入力するため、CoreDataは、オブジェクトが最初から変更されていることを認めます。

では、どうすれば新しい管理対象オブジェクトを作成して、変更と見なさずに初期化できますか?

- (Company *)createNewDefaultCompany:(NSString *)name{
    Company *company = [Company insertInManagedObjectContext:managedObjectContext];
    [company setName:name];
    [company setDate:[NSDate date]];
    [company setLocalisation:@"en_UK"];

    Input *input = [Input insertInManagedObjectContext:managedObjectContext];
    [input populateWithDefault];
    [company setCompanyInputs:input];

    Formulas *formulas = [Formulas insertInManagedObjectContext: managedObjectContext];
    [formulas populateWithDefault];
    [company setCompanyFormula:formulas];

    [company createCalculus];
    return company;
} 

管理対象オブジェクトの作成。

+(Company *)insertInManagedObjectContext:(NSManagedObjectContext *)managedObjectContext{
    return (Company *)[NSEntityDescription insertNewObjectForEntityForName:@"Company" inManagedObjectContext:managedObjectContext]; 
}
4

3 に答える 3

3

これを実際にテストすることはできませんが、管理company対象オブジェクトのセットアップ後に管理対象オブジェクトコンテキストを保存し、この保存後に変更を確認することを検討してください。ユーザーがバックアウトした場合に新しいオブジェクトを削除するdeleteObjectには、管理対象コンテキストでメソッドを呼び出して、新しいオブジェクトへの参照を渡すだけです。オブジェクトを削除した後は、必ずコンテキストを再度保存してください。

于 2012-05-03T19:14:11.397 に答える
0

これを行うための可能な方法は、管理対象オブジェクトコンテキストでNSUndoManagerを使用することです。UNDO登録が無効になっているコードのブロックでデフォルト値の設定をラップすることができます。

- (Company *)createNewDefaultCompany:(NSString *)name{
    [[managedObjectContext undoManager] disableUndoRegistration];

    Company *company = [Company insertInManagedObjectContext:managedObjectContext];
    [company setName:name];
    [company setDate:[NSDate date]];
    [company setLocalisation:@"en_UK"];

    Input *input = [Input insertInManagedObjectContext:managedObjectContext];
    [input populateWithDefault];
    [company setCompanyInputs:input];

    Formulas *formulas = [Formulas insertInManagedObjectContext: managedObjectContext];
    [formulas populateWithDefault];
    [company setCompanyFormula:formulas];

    [company createCalculus];

    [managedObjectContext processPendingChanges];
    [[managedObjectContext undoManager] enableUndoRegistration];

    return company;
} 

canUndo次に、UNDOマネージャーで状態を確認します。-removeAllActionsこのViewControllerに元に戻すことができるアクションがなかったとすると(View Controllerに出入りするときに、Undo Managerでこれをクリアできます)、このNSManagedObjectを作成して初期化した後に、変更が行われたかどうかを元に戻す状態に反映する必要があります。

ただし、会社のオブジェクトを作成する前に元に戻す状態をワイプする必要があるため、管理対象オブジェクトのコンテキストで他の場所で元に戻るを使用する場合は、これが最善の解決策ではない可能性があります。

于 2012-05-03T19:58:08.490 に答える
0

NSManagedObjectが変更済みとしてマークされていないことを確認するには、通常のセッターを使用せず、代わりにsetPrimitiveValue:を使用してください。ところで:通常、NSManagedObjectの初期化はawakeFromInsertメソッドで行われます。

于 2014-02-19T13:46:42.660 に答える