【发布时间】:2011-03-16 03:09:16
【问题描述】:
这是我正在讨论的关系的图像:
我将 UIScrollView 设置为水平滚动条,可在 3 个不同的 UIViewController 之间滚动(当然包含 UITableView 和所需的委托方法等)
UIScrollView 中的每个 ViewController 都会加载特定 MyObjectType 的 UITableView。
(例如,ViewController1 加载所有 MyObjects 的表格视图,其中它的 type == MyObjectType.name)
这有意义吗?您会注意到我在对象之间设置了反向关系。一个 MyObjectType 可以有多个 MyObject,但一个 MyObject 只能有一个与之关联的 MyObjectType。
当我第一次加载一个 UIScrollView viewController 时,我需要确定这个 UITableView 用于什么MyObjectType。我有这个工作正常,我相应地设置了表头。
例如[type valueForKey:@"name"] 其中 type 是 MyObjectType 的获取结果 NSManagedObject。
问题是我想知道,当我获得 MyObjectType 的 NSManagedObject 时,我是否也无法访问可以用作 UITableView 的 NSSet *array(即[type valueForKey:@"objects"])数据源?如果在我添加或删除一个对象之后我保存 managedContext然后我总是[tableView reloadData] ?
我猜这会起作用,只要我不需要 UITableView 内容在添加这种类型的新 MyObject 时动态更改和更新?为此,我们需要一个 NSFetchedResultsController 对吗?
这是我将 ALL MyObject 加载到 UITableView 中的代码(有效):
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"MyObject" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"creationDate" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:20];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext sectionNameKeyPath:@"transientSectionDate"
cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
[sort release];
[fetchRequest release];
[theFetchedResultsController release];
return _fetchedResultsController;
}
能否请人向我展示我需要正确加载的实际 NSPredicate 声明 ONLY MyObject 的 MyObjectType.name = = @“XXXXXX”?假设我已经有一个 MyObjectType.name 存储在 ViewController 内的保留 NSString 中。
提前致谢!
【问题讨论】:
标签: iphone cocoa core-data nsfetchedresultscontroller nspredicate