Хорошо.
Я посмотрел код, который вы разместили на GitHub, и обнаружил несколько проблем с вашим контроллером DetailView, которые я обрисовал ниже.
Во-первых, вы былинеправильная передача контекста управляемого объекта в подробный вид, что означает, что когда вы пытались сохранить ваши объекты, не было контекста, из которого они были бы сохранены.Считайте контекст управляемого объекта «черновиком» вашего постоянного хранилища.Любые изменения, внесенные вами в NSManagedObject, будут отслеживаться и сохраняться в вашем контексте до тех пор, пока вы не сохраните их с помощью команды [managedObjectContext save]
.
Итак, чтобы было ясно, вы создаете свой контекст в своем AppDelegate, а затем вы передаетессылка на него в вашем RootViewController с rootViewController.managedObjectContext = self.managedObjectContext
Из RootViewController вам нужно передать управляемый объектObjectContext в DetailView, используя ту же технику.Итак, в вашем методе tableView:didSelectRowAtIndexPath:
вы должны передать ссылку на контекст, чтобы любые изменения, сделанные вами в этом представлении, были отслежены и в конечном итоге могли быть сохранены:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
DetailView *detailView = [[DetailView alloc] initWithNibName:@"DetailView" bundle:nil];
detailView.event = (Event *)[[self fetchedResultsController] objectAtIndexPath:indexPath];
detailView.managedObjectContext = self.managedObjectContext;
// ...
[self.navigationController pushViewController:detailView animated:YES];
[detailView release];
}
Я также обновил все остальныессылки на managedObjectContext, где вы создавали экземпляр нового объекта контекста, чтобы просто указать на self.managedObjectContext, то есть:
JustString *_justString = [NSEntityDescription insertNewObjectForEntityForName:@"JustString" inManagedObjectContext:self.managedObjectContext];
Как только это вышло, есть только одна вещь, которая мешает вам сохранитьобъект изображения, который TechZen затронул выше.
В вашем контроллере DetailView у вас есть метод imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
, в котором вы преобразуете UIImage в NSData, а затем назначаете его своему экземпляру сущности Image.
Проблема в том, что в вашей объектной модели (см. Event.m) у вас уже есть метод преобразователя с именем -(id)transformedValue:(id)value
.
Таким образом, вы пытались преобразовать UIImage в NSData.и затем передача NSData объекту, который фактически ожидал UIImage.В этом случае я бы рекомендовал, чтобы ваша объектная модель имела дело с преобразованием данных, поэтому в вашем контроллере DetailView закомментируйте код преобразователя UIImage to NSData и передайте изображение непосредственно в ваш управляемый объект:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
UIImage *selectedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
// Transform the image to NSData
// ImageToDataTransformer *transformer = [[[ImageToDataTransformer alloc] init] autorelease];
// NSData *imageData = [transformer transformedValue:selectedImage];
Image *_image = [NSEntityDescription insertNewObjectForEntityForName:@"Image" inManagedObjectContext:self.managedObjectContext];
_image.justImage = selectedImage;
[event addEventToImageObject:_image];
[picker dismissModalViewControllerAnimated:YES];
}
После этого вам следует идти вперед, поэтому попробуйте и дайте нам знать, если это решит ваши проблемы.
CoreData может иметь немного крутой кривой обучения, но как только вы ее получитевы поймете, что это один из самых красивых API-интерфейсов, доступных в разработке для iOS.
Удачи вам в этом и дайте нам знать, как у вас дела!Рог