Основной вид моего приложения на основе NSPersistentDocument - это представление таблицы (связанное с NSArrayController), отображающее список записей, под ним есть кнопка «добавить запись». Я хочу, чтобы кнопка вызывала следующее (предположительно тривиальное) поведение.NSArrayController, создающий, изменяющий и затем выбор нового объекта
- Создать новое объект
- установить некоторые значения по умолчанию для нового объекта (которые хранятся в основном документе и не доступны во всем мире)
- добавить его в виде таблицы.
Вот то, что я пытался или уволенные:
- использовать NSArrayController «добавить» действие - проблема: не возвращает новый объект и реализация откладывается, так что невозможно изменить вновь созданный объект
- переопределять значение инициализации класса данных - не будет работать - мне нужно, чтобы получить доступ к данным, которые хранятся в классе документа, например
- Подкласс NSArrayController и переопределение «newObject» - опять же - не будет работать, потому что мне нужно данные доступа, которые хранятся в документе ,
После кода "почти" работали:
- (IBAction)newRecord:(id)sender { MyDataClass *newRecord = [recordsArrayController newObject]; newRecord.setting1=self.defaultSetting1; newRecord.setting2=self.defaultSetting2; // ... etc... [recordsArrayController addObject:newRecord]; [recordsTable scrollRowToVisible:[recordsTable selectedRow]]; [newRecord release]; }
Этот код на самом деле работает хорошо, для несохраненных документов. Но если я сохраню документ и снова открою его, то нажатие на кнопку добавления приведет к новой записи, отображаемой дважды в таблице. Очевидно, что «addObject» является избыточным (хотя он отлично работает в несохраненных документах), но без него новый объект не выбран.
неправильно, вам нужно вызвать '[newRecord релиз]'. Создание его с помощью '-newObject' дает ему значение сохранения +1. –
Помимо аргумента по счету сохранения, этот ответ работает и является гораздо лучшим ответом, чем подкласс NSArray. –
Спасибо, решение работает. Комментарий относительно «relaese» действительно неверен, newObject дает вам сохраненный объект, который вам нужно освободить. –