2014-02-04 5 views
1

У меня есть NSArrayController, связанный с CoreData в моем приложении. Он также привязан к TableView, который отображает данные. Две кнопки привязаны к ArrayController, которые добавляют и удаляют строки. Все это работает так, как ожидалось. Я могу добавлять, редактировать, сохранять и удалять записи CoreData.NSArrayController возвращает null

Существует раздел моего приложения, который должен принимать операции перетаскивания из файлов (работающих). Он берет данные из файлов, ищет различную информацию и должен вставлять эту информацию в базу данных Core Data с помощью контроллера NSArray.

Я добавил класс, обрабатывающий разбор/добавление файла в базу данных как объект в IB. Я создал IBOutlet для контроллера массива в классе и связал контроллер с реферируемым выходом класса.

Если я добавлю кнопку к интерфейсу, чтобы напрямую вызвать метод, который добавляет пользовательскую запись в базу данных, все будет работать. Если метод вызывается с помощью операции перетаскивания, ничего не работает, даже запись простого [arrayController className] возвращает значение null (хотя возвращает NSArrayController, как ожидалось, когда метод вызывается из нажатия кнопки).

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

Любая помощь приветствуется. Благодаря!

==================

ОБНОВЛЕНИЕ Оказывается, я был подключение IBOutlet к классу (подклассу вида) объекту в IB вместо к самому виду обработки капель. Соединяя их, все работает. Ну, не работайте, теперь у меня есть другие проблемы, но теперь контроллер массива создается.

ответ

1

Переведено с комментария, чтобы ответить: Контроллер массива, который вы пытаетесь добавить материал не создается. Я предполагаю, что вы не имеете в виду свое первоначальное NSArrayControllerinstance, но, возможно, новое созданное? Вероятно, проблема связи между экземплярами вашего класса.

+0

Да, это не то, что я понял. Я просто не знаю, почему. Как я уже сказал выше, экземпляр работает, когда я обращаюсь к методу в классе непосредственно через интерфейс, поэтому привязка к атрибуту NSArrayController правильна. Тем не менее, операция перетаскивания перетаскивания проходит через другой класс перед тем, как его перетащить в тот, который обрабатывает вставку. Хмм. У меня появилась идея, я пойду попробовать. –

+0

Скорее всего, это самый близкий ответ на то, что я нашел. У меня есть представление, которое подклассифицировано для добавления функциональности перетаскивания. Сам подкласс был добавлен как объект в IB, и все мои привязки были для этого класса, а не для самого представления. Как только я привязался к самому представлению, контроллер массива внезапно переставал быть нулевым. –

-1

Что-то не подключено правильно, НО вы не хотите делать это так или иначе. Нет смысла вставлять через NSArrayController. Просто создавать новые объекты с NSEntityDescription с:

+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context; 

И вы сделали. Если ваш NSArrayController подключен правильно, он автоматически загрузит новые объекты в конце события, чтобы пользователь сразу их увидел.

+1

«Нет смысла вставлять через NSArrayController». - Конечно, есть.Если вы используете методы add/insert, а 'selectsInsertedObjects' -' YES', вставленные/добавленные объекты будут автоматически выбраны после вставки (очень распространенный вариант использования). В противном случае вам нужно дождаться появления изменений в текущем контексте или принудительно обновить контроллер массива, найти его и выбрать его самостоятельно. –

+0

Хорошо, это преимущество, но с другой стороны, если вы вставляете через ArrayController, вам нужно искать объекты, которые вы только что вставили вручную, если хотите их изменить, что вы чаще всего делаете. Поэтому я имел в виду, что это будет чистый код. Кроме того, ОП не сказал (а), что он хотел, чтобы выбранные предметы. –

0

Отладка должна быть простой ... с использованием отладчика. Установите несколько точек останова (по одному при каждом действии, который вызывается кнопками, и по одному в каждой точке, где ваши экземпляры класса предназначены для общения друг с другом (ваш импортер и ваш основной контроллер)). Запустите, проверьте, выполните код, когда отладчик разбивается на каждую точку останова.

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

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