这个问题是关于核心数据的。
我创建了一个名为电视的实体,其中包含三个名为名称,价格和尺寸的属性。我还使用 TV.h 和 TV.m 文件创建了NSMutableObject的子类。
我将 TV.h 导入我的 DetailViewController.h ,它处理我想要取值的滑块和UIElements。
所以我做了一个获取请求,一切正常,但是:
每当我更新UISlider(valueDidChange :)时,Xcode会创建我的实体的 COPY ,并将其添加到我的电视对象。
我只想要Xcode只是编辑并保存到当前实体,而不是编辑并保存在新实体中。
非常感谢帮助!
提前谢谢。
我的代码:
DetailViewController.m
- (IBAction)collectSliderValue:(UISlider *)sender {
if (__managedObjectContext == nil) {
NSLog(@"Problem ...");
__managedObjectContext = [(MasterViewController *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSLog(@"... solved!");
}
if (sender == sizeSlider) {
NSError *error = nil;
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"TV" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
TV * currentTV = [[TV alloc] initWithEntity:entity insertIntoManagedObjectContext:context];
currentTV.size = [[NSNumber alloc] initWithInt:(sender.value + 0.5f)];
currentTV.name = @"New TV!";
NSError *error11;
[__managedObjectContext save:&error11];
for (NSManagedObject *info in fetchedObjects)
{
NSLog(@"Name = %@", [info valueForKey:@"name"]);
NSLog(@"Size = %@", [info valueForKey:@"size"]);
NSLog(@"Price = %@", [info valueForKey:@"price"]);
}
[fetchRequest release];
}
答案 0 :(得分:0)
//Editing begins ...
TV * currentTV = [[TV alloc] initWithEntity:entity insertIntoManagedObjectContext:context];
编辑没有开始,你正在那里创建一个新对象。您的视图控制器需要一个实例变量来保存您正在修改的当前TV
实体。
从您创建的模板项目中,变量detailItem
包含您当前正在编辑的托管对象。您应该将其专门设置为TV
对象,并在您的detailViewController代码中引用它而不是currentTV
。您必须删除所有获取请求和托管对象上下文代码 - 这与您的详细视图控制器无关,它应由主视图控制器管理。
所以,在DetailViewController.h中:
@property (strong, nonatomic) id detailItem;
变为
@property (strong, nonatomic) TV detailItem;
在你的collectSliderValue方法中,它应该看起来更简单:
- (IBAction)collectSliderValue:(UISlider *)sender
{
if (sender == sizeSlider)
self.detailItem.size = [NSNumber numberWithFloat:sender.value];
}
管理对象上下文的保存不应该发生在详细视图控制器中,这在应用程序委托中需要处理。
在主细节控制器.m文件中,您可能还需要导入TV.h文件,以便它知道电视是NSManagedObject
子类。此外,在设置详细信息时投射到电视:
self.detailViewController.detailItem = (TV*)selectedObject;