我有一个小的状态栏应用程序。当我关闭窗口时它会保存,当我退出应用程序时它会保存,但每次我在我的表格视图中编辑一行或者我向我的数组控制器添加一些东西时它都不会保存。是否有一种方法可以调用 saveAction 至少每次“输入”点击或当我确认编辑时?保存按钮不是我要寻找的。提前致谢。
3 回答
这是我的方法:
1)创建一个子类NSManagedObject
来添加自动保存的功能。如果您在其他地方定义了全局函数,您可以用do { try managedObjectContext?.save() } catch { print(error) }
类似的东西替换该行。saveContext()
请注意,autosave
默认情况下禁用。
class AutoSaveManagedObject: NSManagedObject {
class var autosave: Bool { return false }
var autosave: Bool?
private var previousValue: AnyObject?
override func willChangeValueForKey(key: String) {
super.willChangeValueForKey(key)
if ( autosave == true ) || ( autosave == nil && self.dynamicType.autosave ) {
previousValue = valueForKey(key)
}
}
override func didChangeValueForKey(key: String) {
super.didChangeValueForKey(key)
if ( autosave == true ) || ( autosave == nil && self.dynamicType.autosave ) {
if "\(previousValue)" != "\(valueForKey(key))" {
do { try managedObjectContext?.save() } catch { print(error) }
}
previousValue = nil
}
}
}
2)使所有核心数据对象的子类,AutoSaveManagedObject
而不是NSManagedObject
。如果你想启用自动保存,你应该这样写:
class MyMO: AutoSaveManagedObject {
override class var autosave: Bool { return true }
// Your @NSManaged vars here
}
3)现在所有的实例MyMO
都启用了自动保存。如果你想为某个实例禁用它,你总是可以写:
let myMO = ... as? MyMO
myMO?.autosave = false
请注意,实例的var autosave
优先级始终高于class var autosave
,因此您可以设置myMO?.autosave = nil
以使用autosave
类的默认设置。
我只需将您的视图控制器设置为文本字段和文本视图的代表。在 iOS 环境中,您可以将协议 UITextFieldDelegate 和 UITextViewDelegate 添加到您的视图控制器头文件中,并分别为 UITextField 和 UITextView 实现方法- (void)textFieldDidEndEditing:(UITextField *)textField
和- (void)textViewDidEndEditing:(UITextView *)textView
。
作为 UITextField (iOS) 的替代方法,有一个名为的委托方法- (BOOL)textFieldShouldReturn:(UITextField *)textField
,只要在 UITextField 上按下“输入”键,就会调用该方法。
在 Mac OSX 环境中,您将向视图控制器头文件添加适当的协议(对于 NSTextView 添加 NSTextDelegate,对于 NSTextField 添加 NSControlTextEditingDelegate),然后实现适当的方法:-(void)textDidChange:(NSNotification *)notification
对于 NSTextView 和- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor
NSTextField。
您可以在这些方法中进行所需的任何类型的验证,然后[myMOC save:&error];
在返回之前进行调用。
每当您在该方法中编辑一行时,请编写此代码
[[NSNotificationCenter defaultCenter] addObserver:self selector:(autosaveCoreData:) name:nil object:your_tableview_object];
-(void)autosaveCoreData:(Event*)event{
event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:_managedObjectContext];
[event setValue:Attribute_Value forKey:@"your atttribute"];
NSError *error;
if (![_managedObjectContext save:&error]) {
}
}
}
我希望这可以解决您的问题