这是我正在辩论的关系的图像:
我有一个UIScrollView设置作为水平滚动条,在3个不同的UIViewControllers之间滚动(当然包含UITableView和所需的委托方法等)。
UIScrollView中的每个ViewController都会加载特定 MyObjectType 的UITableView。 (例如,ViewController1加载所有 MyObjects 的表视图,其类型 == MyObjectType.name )
这有意义吗?你会注意到我在对象之间设置了反比关系。 MyObjectType 可以包含许多 MyObject ,但 MyObject 只能有一个与其关联的 MyObjectType 。< / p>
当我第一次加载其中一个UIScrollView viewController时,我需要确定这个UITableView的用途是什么 MyObjectType 。我有这个工作正常,我相应地设置表头。
E.g。 [type valueForKey:@"name"]
其中 type 是 MyObjectType 的获取结果NSManagedObject。
我想知道的是,当我获得 MyObjectType 的NSManagedObject时,我还无法访问我可以使用的NSSet *数组(即。[type valueForKey:@"objects"]
) UITableView的数据源?如果我添加或删除一个对象后我保存 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 声明吗仅 MyObject的 MyObjectType.name = = @“XXXXXX”?假设我已经将一个 MyObjectType.name 存储在ViewController中保留的NSString中。
提前致谢!
答案 0 :(得分:0)
谓词格式字符串为:
@"ALL type.name=%@", typeName
但是,由于您确实拥有特定的MyObjectType对象,因此您已经可以直接访问所需的MyObject对象,而不必浪费时间尝试获取它们。只需将该集转换为已排序的数组即可。
要在表处于活动状态时了解正在进行的更改,请在tableview数据源对象中实现observeValueForKeyPath:ofObject:change:context:
。然后将addObserver:forKeyPath:options:context:
发送到该特定的MyObjectType对象,如下所示:
[anObjectType addObserver:self
forKeyPath:@"objects"
options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld)
context:nil];
现在,只要该特定MyObjectType的objects
值发生更改,就会通知tableview的数据源并可以更改该表。
有关详细信息,请参阅Key-Value Observing Programming Guide。