2013-06-20 2 views
0

У меня есть приложение с статусом. Он сохраняет, когда я закрываю окно, оно сохраняется при выходе из приложения, но оно не будет сохраняться каждый раз, когда я редактирую строку в моем представлении таблицы, или я добавляю что-то в свой контроллер массива. Есть ли способ вызвать saveAction, по крайней мере, каждый «ввод» или когда я подтверждаю редактирование? Кнопка сохранения не является тем, что я ищу. Спасибо заранее.Realtek coredata autosave

+0

При нажатии «enter» вы имеете в виду каждый раз, когда клавиша ввода нажата, когда фокус находится на столе? Кроме того, что вы имели в виду, как подтвердить изменение без какой-либо кнопки сохранения? – JiuJitsuCoder

+0

например: если у меня есть табличное представление, и я дважды щелкнув по текстовой ячейке, я войду в режим редактирования, и значение будет обновляться каждый раз, когда я нажимаю клавишу ввода. В текстовом виде, когда ключ ввода принимается как разрыв строки, я подтвержу, что редактирование просто «отнимает» фокус из этого текстового представления. –

ответ

0

Я просто установил ваш контроллер представления как делегат как для текстового поля, так и для текстового поля. В среде 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];, прежде чем вы вернетесь.

+0

Это отлично работает для текстовых полей, но не для флажка. Однако я могу использовать NSNotification для этих элементов управления. –

+0

Если это основные элементы управления, которые вы хотите сохранить при изменении, то я согласен, проще просто выполнить базовое уведомление или метод KVO, чтобы сделать сохранение на флажке. Если у вас была очень сложная структура ячеек с различными элементами управления, вы могли бы просто добавлять вызовы к этому методу уведомлений всякий раз, когда вы хотели бы вызвать сохранение при изменении состояния, что упростило бы реализацию/более гибкую, чем стратегия KVO. – JiuJitsuCoder

+0

однако вы должны изменить свой ответ, потому что это неверно: в какао вы используете 'controlTextDidEndEditing' вместо' textFieldDidEndEditing', что для ios –

-1

Когда бы вы изменить строку внутри этого метода написать этот код

[[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]) { 

} 
    } 
} 

Я надеюсь, что это может решить вашу проблему

+0

Первая строка этого кода вызывает несуществующий метод. Какое уведомление вы пытаетесь наблюдать? На каком объекте? –

+0

Прошу прощения за то, что я его отредактирую. – GameBegins

+1

Я думаю, что это скомпилируется, но ... это действительно то, что вы хотите сделать? Это наблюдает каждое уведомление, которое отправляет объект. Вы уверены, что никогда не опубликует уведомление по какой-либо другой причине? Почему бы не использовать имя уведомления? –

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 класс.