UIPickerView выбирает объект из managedObjectContext

#objective-c #core-data

#objective-c #core-данные

Вопрос:

Я уже некоторое время борюсь с проблемой, связанной с CoreData:

У меня есть приложение на основе представления с панелью вкладок в нем. Первые две вкладки — это контроллеры просмотра, которые отображают содержимое из моих CoreData, на третьей вкладке есть UIPickerView, где я могу выбирать данные. Затем третий и второй контроллеры просмотра должны выбрать правильный объект на основе выбора UIPickerView.

Чтобы прояснить это немного больше: в моем managedobjectcontext у меня есть 16 объектов. На основе выбора UIPickerView в ThirdViewController я хочу использовать соответствующий объект и обновить FirstViewController и SecondViewController.

Это также должно быть постоянным решением, чтобы пользователь мог выйти из приложения, но выбор из UIPickerView должен быть сохранен. Может быть, это что-то для NSUserDefaults?

Любая помощь была бы высоко оценена!

Комментарии:

1. Я не совсем понимаю, о чем вы спрашиваете. Вы спрашиваете, как сохранить что-либо в Core Data в целом? Вы спрашиваете, следует ли вам использовать Core Data в отличие от пользовательских настроек по умолчанию? Вы спрашиваете, как передать конкретный управляемый объект другому контроллеру представления?

2. О, прошу прощения за то, что вызвал небольшую путаницу. Я не хочу сохранять что-либо в Core Data. Чтобы прояснить это еще раз: у меня есть 3 ViewControllers: ViewController # 1: показывает данные из Core Data ViewController # 2: показывает данные из Core Data ViewController # 3: имеет UIPickerView, который позволяет пользователю выбрать один объект с его атрибутами из Core Data.

3. Чего я хочу, так это следующего: когда пользователь выбирает объект из ViewController # 3, эта информация должна постоянно храниться, чтобы ViewController # 1 и # 2 всегда знали (даже когда пользователь выходит из приложения — без фона!), из какого объекта они должны получать данные. Я ясно выразился?

4. Вы говорите «объект», но я думаю, вы имеете в виду конкретный управляемый объект. Объекты относятся к управляемым объектам так, как классы относятся к экземплярам. Например. У вас может быть Person объект в вашей модели данных для описания человека, т. е. Имя, фамилия, но конкретный человек, скажем «Боб Смит», будет описываться конкретным управляемым объектом, инициализированным для Person объекта. Который вам нужно сохранить из ViewController # 3.

Ответ №1:

Я не совсем понимаю, нужно ли вам сохранять имя объекта или конкретный управляемый объект, но в обоих случаях решение одно и то же: вам нужно сохранить ссылку в NSUserDefaults.

Чтобы сохранить объект в пользовательских настройках по умолчанию, вам нужно просто сохранить имя объекта в виде строки. Итак, что-то вроде:

   [[NSUserDefaults standardUserDefaults] setValue:entityNameString forKey:@"currentlySelectedEntity"];
  

… и для его извлечения:

   NSString *currentEntity=[[[NSUserDefaults standardUserDefaults] valueForKey:@"currentlySelectedEntity"];
  

Если вам нужно сохранить ссылку на конкретный управляемый объект, вам необходимо сохранить идентификатор управляемого объекта для сохраненного объекта. Сохранение очень важно. До сохранения контекста, в котором был создан объект, идентификатор объекта имеет только временное значение, которое изменится при сохранении. Любая ссылка на объект будет потеряна, если вы используете временное значение.

Чтобы сохранить идентификатор объекта:

   NSManagedObject *mo=[NSEntityDescription insertNewObjectForEntityForName:@"TestEntity" inManagedObjectContext:self.managedObjectContext];
  //... save the context
  NSManagedObjectID *moID=[mo objectID];
  NSURL *moIDURI=[moID URIRepresentation];
  [[NSUserDefaults standardUserDefaults] setValue:moIDURI forKey:@"currentlySelectedTestObject"];
  

… чтобы повторно получить его:

   NSURL *uri=[[NSUserDefaults standardUserDefaults] valueForKey:@"currentlySelectedTestObject"];
  NSManagedObjectID *moID=[self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri];  
  NSManagedObject *mo=[self.managedObjectContext objectRegisteredForID:moID];
  

(Приведенный выше код не скомпилирован и может содержать опечатки, поэтому не просто копируйте и вставляйте его.)