2015-03-02 2 views
0

У меня есть очень простой проект, содержащий NSTableView с 3 столбцами и кнопками для добавления новой строки, удаления строки и сохранения данных.NSTableVIew привязано к NSArrayController не сохраняет изменения

Для целей этого проекта я хочу, чтобы сохранить значения в NSUserDefaults дб И все это делать без программирования, поэтому IB соединения и свойства следующим образом:

Добавлена ​​объекта массива контроллера через IB. Его содержимое Контролера привязано к контроллеру общих пользователей по умолчанию (ключ контроллера: значения, путь ключа модели: значения myvalues), проверяет содержимое содержимого как составное значение.

Добавлен набор табличных представлений, чтобы иметь 3 столбца и установить как основанные на представлении.

Для самого представления таблицы, его контент связан с массива контроллера (Controller Key arrangedObjects) и его селекционных индексов связаны с массива контроллера (Controller Key selectionIndexes)

Для каждого столбца таблицы, в таблице View Элемент ячейки (третий в цепочке) Значение привязано к представлению ячейки таблицы (ключ контроллера пуст, путь ключа модели установлен на objectValue.xxxx, где xxxx - произвольная строка имени для столбца); также атрибут «Поведение» имеет значение «редактируемый».

Добавляемые строки и удаленные кнопки строки, связанные с действиями, подключаются к методам добавления и удаления контроллера массива, а действие, связанное с нажатием кнопки «Сохранить», связано с методом сохранения общих настроек по умолчанию.

Когда я запускаю проект, я изначально могу «добавить», ввести значения для столбцов, нажать «Сохранить», завершить выполнение, а когда я заново запустил его, будут показаны данные. Однако, если я попытаюсь изменить любую из этих данных, изменения не будут сохранены. Если я добавлю дополнительные строки и введите данные, данные не будут сохранены (строки будут там, просто пусты). Удаление строк работает так, как ожидалось. (ПРИМЕЧАНИЕ: также, если я добавил несколько строк в исходное исполнение, только первые будут иметь данные о последующих исполнениях)

Мой вопрос: Почему данные не будут меняться (после первого)? Кажется, что где-то есть недостающий слой.

Я создал второй проект, очень похожий на первый, но указанный сотовой таблицы, а не на основе представления; также привязки проще с привязками NO для табличного представления, а просто привязывают ячейки таблицы Value to Array Controller. Этот проект отлично работает. Данные ячейки можно редактировать, введены новые данные строки, и т.д.

Любая помощь будет оценена

+0

Дубликат http://stackoverflow.com/q/27308592/1312143, на который я ответил, хотя я никогда не слышал ответа, если бы мой ответ сработал. Попробуй и посмотри. –

+0

спасибо за ответ; поскольку моя цель состояла в том, чтобы сделать это без какой-либо кодировки, я думаю, что сейчас я буду придерживаться таблицы на основе сотовой сети. Если я попробую ваш подход в будущем, вы узнаете, работает ли он. – user2132980

ответ

-1

Поскольку ячейки таблицы на основе работы, как и ожидалось, без кодирования, я собираюсь использовать, что на данный момент. Что касается правильной работы таблицы, основанной на просмотре, то она появляется (из заметок Кен и других потоков SO), что управляемый контент, вероятно, правильно обновляется, но контроллер по умолчанию для пользователя не получает информации об этих изменениях. Таким образом, простое решение было бы добавить пару строк кода, например, в методе AppDelegate applicationWillTerminate:

let ac : NSArray = arrayController!.arrangedObjects as NSArray 
NSUserDefaults.standardUserDefaults().setObject(ac, forKey: "myvalues") 

где arrayController является выход для IB массива контроллера.

(Это немного избыточно, поскольку он будет устанавливать объект каждый раз, когда приложение будет запущено, но вы также можете подключить кнопку SAVE к методу, который установил бы Bool, а затем запрограммировал бы setObject условно на SAVE.)

Смежные вопросы