在我的iPhone核心数据应用程序中,我将其配置为主 - 详细视图设置。
主视图是一个UITableView,它列出了List
实体的对象。 List实体与Task
实体具有多对多关系(称为“任务”),并且Task实体与List
具有与“list”相反的一对一关系。
在主视图中选择List
对象时,我希望详细视图(另一个UITableView)列出与该Task
对象对应的List
个对象。到目前为止我所做的是:
在详细视图控制器中,我声明了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 getter如下所示:
- (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;
}
它与Core Data项目模板中的默认值几乎没有变化,我所做的更改是添加一个始终返回false的谓词,原因是当没有选择List时我不希望显示任何项目在详细视图中(如果选择了列表,则在列表属性的setter中更改谓词)。
然而,当我选择一个列表项时,没有任何事情发生。表视图中没有任何内容更改,它保持为空。我确信我的逻辑在几个地方存在缺陷,建议表示赞赏
由于
答案 0 :(得分:1)
您无需为任务列表设置NSFetchedResultsController
。由于您要传递List实体,因此您可以向List实体询问任务:
NSSet *tasks = [[self list] valueForKey:@"tasks"];
NSSortDescriptor *sort = ...;
NSArray *sorted = [[tasks allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
[self setTasks:sorted];
然后让UITableviewDatasource
方法运行tasks
数组。
答案 1 :(得分:0)
也许我完全不懂你的设置,但是
detailViewController.list.task
(或调用任何关系)将返回与List对象关联的任何Task对象的NSSet。
答案 2 :(得分:0)
好吧,我有类似的问题,我在How to switch UITableView's NSFetchedResultsController (or its predicate) programmatically?发布了我的问题。
发布后,我决定试用你的代码。你知道吗?它的工作原理只有一小部分:
[self.tableView reloadData];
也许您可以回到初始代码并确认。
问候。