gpt4 book ai didi

iphone - NSFetchedResultsController 获取请求 - 更新谓词和 UITableView

转载 作者:行者123 更新时间:2023-12-03 20:11:15 25 4
gpt4 key购买 nike

在我的 iPhone Core Data 应用程序中,我将其配置在主从 View 设置中。

主视图是一个 UITableView,它列出 List 的对象。实体。 List 实体与Task 具有一对多关系。实体(称为“任务”),并且任务实体与 List 具有逆对一关系。称为“列表”。

List在主视图中选择对象,我希望详细 View (另一个 UITableView)列出 TaskList 对应的对象目的。到目前为止我所做的是:

在详细 View Controller 中,我声明了 List 的属性。对象:

@property (nonatomic, retain) List *list;

然后在主视图 Controller 中我使用这个 TableView 委托(delegate)方法来设置 list选择列表时详细 View Controller 的属性:

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
detailViewController.list = (List*)selectedObject;
}

然后,我重写了 list 的 setter 详细 View Controller 中的属性如下所示:

- (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 的对象。目的。详细 View Controller 的 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 的谓词,原因是当没有选择列表时我不希望显示任何项目在详细信息 View 中(如果选择了列表,则列表属性的 setter 中的谓词会发生更改)。

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

谢谢

最佳答案

您无需为任务列表设置 NSFetchedResultsController。由于您传入的是 List 实体,因此您只需向 List 实体询问任务即可:

NSSet *tasks = [[self list] valueForKey:@"tasks"];
NSSortDescriptor *sort = ...;
NSArray *sorted = [[tasks allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
[self setTasks:sorted];

然后让 UITableviewDatasource 方法从该 tasks 数组中运行。

关于iphone - NSFetchedResultsController 获取请求 - 更新谓词和 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2528121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com