3

我不知道这有多复杂,

我有一个使用 CoreData 的应用程序。

当我创建一个新的托管对象时,我用 plist 中的默认值填充它的字段。

然后我显示一堆表单(将保存的值加载到表单中并在我进行过程中更新对象的值)。

最后我检查对象是否有更改并建议保存对象。

这部分工作正常。

但是,当用户在界面中点击“返回”时遇到问题。如果用户更改了对象中的任何内容,我希望能够显示警报,或者如果没有任何更改,则让用户返回。

但是,我希望你有更改,因为我使用默认数据填充对象,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

为确保 NSManagedObject 未被标记为已更改,您不应使用普通的设置器,而应使用 setPrimitiveValue: 代替。顺便说一句:通常,NSManagedObject 初始化是在 awakeFromInsert 方法中完成的。

于 2014-02-19T13:46:42.660 回答
0

一次可能的方法是在托管对象上下文中使用 NSUndoManager。您可以将默认值设置包装在禁用撤消注册的代码块中:

- (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撤消管理器的状态。假设没有可撤消的操作进入此视图控制器(您可以-removeAllActions在进入或退出视图控制器时在撤消管理器上清除它),撤消状态应反映在创建和初始化此 NSManagedObject 后是否进行了任何更改。

但是,如果您想在托管对象上下文的其他地方使用撤消,这可能不是最佳解决方案,因为需要在创建公司对象之前擦除撤消状态。

于 2012-05-03T19:58:08.490 回答