在我的 iPhone Core Data 应用程序中,我将其配置为主从视图设置。
主视图是一个 UITableView,它列出了List
实体。 List 实体与Task
实体(称为“任务”),并且任务实体与List
称为“列表”。
When a List
在主视图中选择对象,我希望详细视图(另一个 UITableView)列出Task
对应的对象List
目的。到目前为止我所做的是:
在详细视图控制器中,我声明了一个属性List
object:
@property (nonatomic, retain) List *list;
然后在主视图控制器中我使用这个表视图委托方法来设置list
选择列表时详细视图控制器的属性:
- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
detailViewController.list = (List*)selectedObject;
}
然后,我重写了设置器list
详细视图控制器中的属性如下所示:
- (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;
}
它与核心数据项目模板中的默认值几乎没有变化,我所做的更改是添加一个始终返回 false 的谓词,原因是当没有选择列表时,我不希望在详细信息中显示任何项目视图(如果选择了列表,则列表属性的设置器中的谓词会发生更改)。
然而,当我选择一个列表项时,什么也没有发生。表视图中没有任何变化,它保持为空。我确信我的逻辑在很多地方都有缺陷,建议不胜感激
Thanks