在我的iPhone核心数据应用程序中,我已经配置了一个主 - 细节视图设置。NSFetchedResultsController获取请求 - 更新谓词和UITableView
主视图是一个UITableView,其中列出了List
实体的对象。 List实体与Task
实体(称为“任务”)具有多对多的关系,并且任务实体与List
称为“list”具有相反的关系。
当在主视图中选择一个对象List
,我想要的细节视图(另一个的UITableView)以列出对应于List
对象Task
对象。什么我迄今所做的是:
在详细信息视图控制器我已经宣布了List
对象的属性:
@property (nonatomic, retain) List *list;
然后在主视图控制器使用该表视图当选择了列表委派方法来设置细节视图控制器的list
属性:
- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
detailViewController.list = (List*)selectedObject;
}
然后,我已经重写在用于list
属性的setter详细信息视图控制器是这样的:
- (void)setList:(List*)newList
{
if (list != newList) {
[list release];
list = [newList retain];
NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"(list == %@)", list];
[NSFetchedResultsController deleteCacheWithName:@"Root"];
[[[self fetchedResultsController] fetchRequest] setPredicate:newPredicate];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
什么我在这里做的是设置在获取结果的谓词过滤掉的对象,这样我只得到属于选定List
对象的人。该fetchedResultsController吸气的详细视图控制器看起来是这样的:
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController == nil) {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Task" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"FALSEPREDICATE"];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
}
return fetchedResultsController;
}
其从核心数据项目模板默认几乎没有变化,我所做的改变是增加一个谓词总是返回false,原因是当没有选择列表时,我不希望在详细视图中显示任何项目(如果选择了列表,则列表属性中的谓词在setter中更改)。
但是,当我选择一个列表项时,什么也没有发生。表格视图中没有任何变化,它保持为空。我敢肯定,我的逻辑是在几个地方有缺陷,建议表示赞赏
感谢
这看起来好多了,会试试看,谢谢! – indragie