3

在我的 iPhone Core Data 应用程序中,我在主从视图设置中对其进行了配置。

主视图是一个列出List实体对象的 UITableView。TaskList 实体与实体(称为“任务”)具有一对多关系,而任务实体与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在详细视图控制器中覆盖了属性的设置器,如下所示:

- (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 时,我不希望在详细信息中显示任何项目视图(如果选择了列表,则在列表属性的设置器中更改谓词)。

但是,当我选择一个列表项时,什么都没有发生。表格视图中没有任何变化,它保持为空。我确定我的逻辑在几个地方有缺陷,不胜感激

谢谢

4

3 回答 3

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数组中运行。

于 2010-03-27T14:28:15.343 回答
0

也许我不完全理解你的设置,但是

detailViewController.list.task

(或任何称为关系的)将返回与 List 对象关联的任何 Task 对象的 NSSet。

于 2010-03-27T05:10:21.237 回答
0

好吧,我有一个类似的问题,我在如何以编程方式切换 UITableView 的 NSFetchedResultsController (或其谓词) 上发布了我的问题?.

发布后,我决定尝试您的代码。你知道吗?它可以工作,只需添加一点点:

    [self.tableView reloadData];

也许你可以回到你的初始代码并确认。

问候。

于 2010-08-16T14:59:16.153 回答