我有一个小状态栏应用。当我关闭窗口时,它会保存,当我退出应用程序时它会保存,但每次我在tableview中编辑一行时都不会保存,或者我向arraycontroller添加了一些东西。 是否有一种方法可以至少在每次“输入”命中时或在我确认编辑时调用saveAction? 保存按钮不是我正在搜索的内容。 提前谢谢。
答案 0 :(得分:1)
这是我的方法:
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
设置上课。
答案 1 :(得分:0)
我只是将视图控制器设置为textfield和textview的委托。在iOS环境中,您可以将协议UITextFieldDelegate和UITextViewDelegate添加到视图控制器头文件中,并分别为UITextField和UITextView实现方法- (void)textFieldDidEndEditing:(UITextField *)textField
和- (void)textViewDidEndEditing:(UITextView *)textView
。
作为UITextField(iOS)的替代方法,有一个名为- (BOOL)textFieldShouldReturn:(UITextField *)textField
的委托方法,只要在UITextField上按下“enter”键,就会调用该方法。
在Mac OSX环境中,您可以将适当的协议添加到视图控制器头文件中(对于NSTextView添加NSTextDelegate,为NSTextField添加NSControlTextEditingDelegate),然后为NSTextView实现适当的方法:-(void)textDidChange:(NSNotification *)notification
和{ {1}}表示NSTextField。
您可以在这些方法中进行任何类型的验证,然后在返回之前拨打- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor
。
答案 2 :(得分:-1)
在该方法中编辑行时,请编写此代码
[[NSNotificationCenter defaultCenter] addObserver:self selector:(autosaveCoreData:) name:nil object:your_tableview_object];
- (无效)autosaveCoreData:(比赛*)事件{
event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:_managedObjectContext];
[event setValue:Attribute_Value forKey:@"your atttribute"];
NSError *error;
if (![_managedObjectContext save:&error]) {
}
}
}
我希望这可以解决你的问题