0

我有一个模型,其中有一个 Person 实体和一个 Picture 实体。在我的 Picture 实体中,我有一个与 Person 有关系的属性。

我想举一个关于如何将图片添加到人员的示例,因为我所做的不起作用。

-(BOOL)savePicture:(NSString *)urlPicture:(Person *)person{
SettingsSingleton *userSettings = [SettingsSingleton sharedManager];    
NSManagedObjectContext *managedObjectContext = [userSettings managedObjectContext]; 
NSEntityDescription *myContentEntity = [NSEntityDescription entityForName:@"Pictures" inManagedObjectContext:managedObjectContext];
NSManagedObject *contentToSave = [[NSManagedObject alloc] initWithEntity:myContentEntity insertIntoManagedObjectContext:managedObjectContext];

[contentToSave setValue:urlPicture forKey:@"url"];
[contentToSave setValue:person forKey:@"relatedPerson"];

[managedObjectContext insertObject:contentToSave];  

NSError *error;
if ([managedObjectContext save:&error]){
    //Deal with errors
    NSLog(@"Error");
            return NO; 
}
return YES;
}

if ([managedObjectContext save:&error]) 它在线崩溃,并且在控制台中我有这些错误:

-[UITableViewCell objectID]: unrecognized selector sent to instance 0x135c2b0 Serious application error.  Exception was caught during Core Data change processing: ***     
-[UITableViewCell objectID]: unrecognized selector sent to instance 0x135c2b0 with userInfo (null) *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** 
-[UITableViewCell objectID]: unrecognized selector sent to instance 0x135c2b0'

在我以前的观点中,我有以下代码

- (void)viewDidLoad {
[super viewDidLoad];
SettingsSingleton *settings = [SettingsSingleton sharedManager];    
managedObjectContext = [settings managedObjectContext]; 
fetchedResultsController = [settings fetchedResultsController];
fetchedResultsController.delegate=self;

NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
    // Handle the error...
}
[settings release];

self.table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 416)  style: UITableViewStyleGrouped];
[table setDataSource:self];
table.delegate=self;
[self.view addSubview: self.table];
}


- (NSFetchedResultsController *)fetchedResultsController {

if (fetchedResultsController != nil) {
    return fetchedResultsController;
}

Person *personTmp=[[Person alloc] init];
personTmp=[personTmp getPersonById:self.personId];

/*
 Set up the fetched results controller.
 */
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Pictures" inManagedObjectContext:managedObjectContext];
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"relatedPerson == %@ AND contentType == %d",personTmp, CONTENT_DATA_PICTURE];

[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];

// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

[aFetchedResultsController release];
[fetchRequest release];
[predicate release];
[personTmp release];


return fetchedResultsController;
}    


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
if(indexPath.row==0){
    cell.textLabel.text=@"Add a picture";
}
else{
    int nb=indexPath.row-1;
    NSIndexPath *ip = [NSIndexPath indexPathForRow: nb inSection:indexPath.section];
    NSManagedObject *managedObject = [fetchedResultsController  objectAtIndexPath:ip];
    cell.textLabel.text = [[managedObject valueForKey:@"url"] description];
    [ip release];
}
return cell;
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
int nb=[[fetchedResultsController sections] count];
if (nb == 0) {
    nb = 1;
}
return nb;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

NSArray *sections = [fetchedResultsController sections];
NSUInteger count = 0;
if ([sections count]) {
    id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:section];
    count = [sectionInfo numberOfObjects];
}
return count+1;
}
4

2 回答 2

6

我发生了一个非常相似的错误。我有一个 navController 首先加载 customTypeA viewController,然后在其上加载 customTypeB viewController。这两个 viewController 都使用 Core Data 和 fetchedResultsControllers 作为 tableview 的数据源。customTypeB 的功能是向 customTypeA 的数据源添加一个新的数据对象。这样做后,我会收到您上面所说的错误“ Serious Error in Core Data, Unrecognized Selector. EXC_BAD_ACCESS”;但是我的错误表明无法识别的选择器是“controllerWillChangeContent”。我的两个视图控制器都使用了 fetchedViewController 委托方法“controllerWillChangeContent、controllerDidChangeObject ...、controllerDidChangeContent”。

我注意到,当 viewControllerB 更改控制器 A 的数据时,即使控制器 B 尚未“弹出”,控制器 A 的 fetchedResultsController 也会激活。所以我想也许控制器B的代表被调用了。查看 Core Data 编程文档,我看到他们建议使用 fetchedResultsController 为每个视图,您应该实现 viewWillDisappear 并在其中设置 fetchedResultsController = nil; 对我来说,这解决了我的问题。

另外仅供参考 - 在为 Snow Leopard 安装 XCODE 3.2 之前,我没有调用 fetchedResultsControllers 的不可见 viewController 代表的问题。Leopard 的代码在 Xcode3.1 中运行良好。

于 2009-09-21T08:29:31.270 回答
1

首先,您不必调用“insertObject”。从苹果文档

如果 context 不是 nil,则此方法调用 [context insertObject:self](这会导致调用 awakeFromInsert)。

所以你重复地插入对象两次。不确定这可能会产生什么负面影响,但它不会是好的。

至于错误,看起来您的代码的其他部分可能是罪魁祸首。该消息的含义基本上是您正在尝试访问 UITableViewCell 的 CoreData objectID。由于这发生在保存期间,我想在此函数之前的某个时间点,您可能会将 UITableViewCell 插入到 managedObjectContext 中,然后当您实际继续保存它时,您只会在此处爆炸。

于 2009-09-03T20:59:47.423 回答