Objective-C:在 NavigationController 中分层传递 CoreData

Posted

技术标签:

【中文标题】Objective-C:在 NavigationController 中分层传递 CoreData【英文标题】:Objective-C: Hierarchical passing of CoreData in NavigationController 【发布时间】:2009-12-21 02:54:55 【问题描述】:

我需要一些关于我遇到的这个问题的指导。我有一个导航控制器,根控制器使用 CoreData 和 NSFetchController。现在,根控制器工作正常。当我单击一个项目时,它应该分层显示下一个 UITable,该 UITable 与前一个根控制器中的行的值相关联。

现在,我不确定应该将什么作为属性传递给下一个 UITableViewController。它应该是一个数组,还是应该传递 NSFetchedResultsController?需要注意的是,在第二层之后的层次结构中还有另一个层级。

谢谢 多伦

【问题讨论】:

【参考方案1】:

至少你有几个选择:

    将托管对象控制器的引用从父视图控制器传递到子视图控制器;或者, 使 MOC 属性可从应用委托中使用,任何视图控制器都可以使用该属性

有些人更喜欢第二种选择,因为您可以重用视图控制器并将其重新排列到不同的层次结构中。通过断开 MOC 与父控制器和子控制器的连接,您可以获得更多的设计灵活性。此外,如果您的应用程序需要同时管理多个持久性存储,那么从一个中心点访问以创建多个 MOC 可以降低代码复杂性。

在其视图控制器中拥有 MOC 后,您可以在该视图控制器中创建获取的结果控制器并在它们自己的线程中应用操作。

编辑

听起来SitePost 之间存在一对多的关系(即一个站点实体有许多帖子实体)。

您的“帖子”列表视图控制器可以包含 site 托管对象、siteID 托管对象 ID 或 siteName 字符串属性。

推送“帖子”列表VC时,设置其sitesiteName属性并相应配置请求谓词。

例如,您的 fetch 请求的谓词应包含 site.name LIKE '%@' 之类的内容,例如:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Post" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *requestPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(site.name like '%@')", self.site.name]];
[fetchRequest setPredicate:requestPredicate];
// ...

或者您可以在managed object IDs 上进行比较,这通常更适合进行独特的比较:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Post" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *requestPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(site = %@)", self.siteID]];
[fetchRequest setPredicate:requestPredicate];
// ...

在这两种情况下,您已过滤您的 Core Data 存储以匹配所有 Post 名称或 site 托管对象 ID 与您的条件等效的实体。

执行提取后,这些实体通常驻留在NSSet*NSArray* 中,您可以轻松地将其用作UITableView 数据存储,尤其是在您使用提取结果控制器时。

【讨论】:

谢谢亚历克斯,我尝试过这样做,因为我正在使用 AppController 在控制器之间传递 MOC 等。这样做(创建一个新的 fetchrequest),我不确定我如何根据先前的结果链接实体(即从站点 - >帖子,我如何做一个与特定选定站点相关的谓词)。这就是我的意思。谢谢老哥 另一件事,请注意,我的模型具有 Site 属性,其中包含许多帖子的 NSSET(这就是为什么我想通过 NSArray)但是我不确定哪个我应该实际进行的方式。您建议使用 MOC,但如果我可以了解它的使用方式,请根据所选站点进行映射。 我目前正在玩 MOC,使用 NSPredicate *pred = [NSPredicate predicateWithFormat:@"(site = %d)", i];我希望与之进行比较的站点实体对象在哪里。显然 %d 不是正确的语法,那么如果我要使用 MOC,我该如何解决这个问题? 嗨,伙计,感谢您的详细回复。现在我实现了你所说的,减去谓词并取回行。现在使用您推荐的谓词 Site.name 它不起作用,所以我使用 Post.h 中的属性,称为 Site sitePosts 并使用(PostSite.name like '%@'),[self.site.name],但得到没有行回来。我这个我的谓词是错误的,但不确定我做错了什么,伙计 不知道出了什么问题。也许您可以发布您的数据模型的屏幕截图,以便我们都使用相同的对象名称,您还可以在初始化获取结果控制器的位置添加代码(在您的帖子视图控制器中)。

以上是关于Objective-C:在 NavigationController 中分层传递 CoreData的主要内容,如果未能解决你的问题,请参考以下文章

iOS 移除导航栏黑线

单视图隐藏/样式中的状态栏

如何在c++中,调用objective-c

iOS 7 - 将数据从 SWRevealViewController 传递到 RearViewController

objective-c入门

iOS 11 中 UINavigationBar 大标题的默认字体?