У меня есть приложение с статусом. Он сохраняет, когда я закрываю окно, оно сохраняется при выходе из приложения, но оно не будет сохраняться каждый раз, когда я редактирую строку в моем представлении таблицы, или я добавляю что-то в свой контроллер массива. Есть ли способ вызвать saveAction, по крайней мере, каждый «ввод» или когда я подтверждаю редактирование? Кнопка сохранения не является тем, что я ищу. Спасибо заранее.Realtek coredata autosave
ответ
Я просто установил ваш контроллер представления как делегат как для текстового поля, так и для текстового поля. В среде iOS вы должны добавить протокол UITextFieldDelegate и UITextViewDelegate в свой заголовочный файл контроллера представления и реализовать методы - (void)textFieldDidEndEditing:(UITextField *)textField
и - (void)textViewDidEndEditing:(UITextView *)textView
для UITextField и UITextView соответственно.
В качестве альтернативы 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];
, прежде чем вы вернетесь.
Это отлично работает для текстовых полей, но не для флажка. Однако я могу использовать NSNotification для этих элементов управления. –
Если это основные элементы управления, которые вы хотите сохранить при изменении, то я согласен, проще просто выполнить базовое уведомление или метод KVO, чтобы сделать сохранение на флажке. Если у вас была очень сложная структура ячеек с различными элементами управления, вы могли бы просто добавлять вызовы к этому методу уведомлений всякий раз, когда вы хотели бы вызвать сохранение при изменении состояния, что упростило бы реализацию/более гибкую, чем стратегия KVO. – JiuJitsuCoder
однако вы должны изменить свой ответ, потому что это неверно: в какао вы используете 'controlTextDidEndEditing' вместо' textFieldDidEndEditing', что для ios –
Когда бы вы изменить строку внутри этого метода написать этот код
[[NSNotificationCenter defaultCenter] addObserver:self selector:(autosaveCoreData:) name:nil object:your_tableview_object];
- (Недействительными) autosaveCoreData: (Event *) событие {
event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:_managedObjectContext];
[event setValue:Attribute_Value forKey:@"your atttribute"];
NSError *error;
if (![_managedObjectContext save:&error]) {
}
}
}
Я надеюсь, что это может решить вашу проблему
Первая строка этого кода вызывает несуществующий метод. Какое уведомление вы пытаетесь наблюдать? На каком объекте? –
Прошу прощения за то, что я его отредактирую. – GameBegins
Я думаю, что это скомпилируется, но ... это действительно то, что вы хотите сделать? Это наблюдает каждое уведомление, которое отправляет объект. Вы уверены, что никогда не опубликует уведомление по какой-либо другой причине? Почему бы не использовать имя уведомления? –
Это мой подход:
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
класс.
При нажатии «enter» вы имеете в виду каждый раз, когда клавиша ввода нажата, когда фокус находится на столе? Кроме того, что вы имели в виду, как подтвердить изменение без какой-либо кнопки сохранения? – JiuJitsuCoder
например: если у меня есть табличное представление, и я дважды щелкнув по текстовой ячейке, я войду в режим редактирования, и значение будет обновляться каждый раз, когда я нажимаю клавишу ввода. В текстовом виде, когда ключ ввода принимается как разрыв строки, я подтвержу, что редактирование просто «отнимает» фокус из этого текстового представления. –