TabBar 项目 - 表格视图中的核心数据

Posted

技术标签:

【中文标题】TabBar 项目 - 表格视图中的核心数据【英文标题】:TabBar Project - Core Data in a tableview 【发布时间】:2014-01-10 14:09:36 【问题描述】:

像许多在我之前的人一样 - 我从“我是 ios 编程新手”开始;我在这里和那里问了几个问题。

我有一个项目,我正在使用 tabbar 项目进行设置。

我在底部有 4 个选项卡,其中一个是“编辑”,当用户单击时,他们会看到一个带有月份选择器的视图。当他们选择月份时 - 屏幕应该加载一个表格视图,其中填充了来自 coredata 的适当月份条目。

我在我的 App Delegate 中设置了 coredata - 但我很好奇如何在应用程序的更深处将信息输入到我的 tableview 中?

我已经完成了THIS TUTORIAL on coredata 的工作,并且在做主从项目时能够让它工作,但这是我正在工作的一个标签栏项目。

我的大部分布局都使用故事板。

当我尝试在 viewDidLoad 中使用这一行时,我不断收到错误:

NSManagedObjectContext *context = [self managedObjectContext];

错误是:

 No visible @interface for 'myEditPageViewController' declares the selector 'managedObjectContext'

我的进口是:

#import "myEditPageViewController.h"
#import "myAppDelegate.h"
#import "CoreData/CoreData.h"

我当前的 viewDidLoad 看起来像这样(我从网上的一些挖掘中得到的 - 请记住,我对这些东西很陌生):

self.context = [self context];
if (self.context == nil)

self.context = [(myAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSManagedObjectContext *context = [self managedObjectContext];

有什么想法吗?我正在尝试将该教程应用于我的应用程序 - 但由于它不是主细节,因此涉及其他视图。只是想让它显示核心数据信息!

【问题讨论】:

【参考方案1】:

关于错误

myEditPageViewController 没有可见的@interface 声明选择器 managedObjectContext

选择器是方法的另一个术语。错误信息是在myEditPageViewController 类中,没有名为managedObjectContext 的方法。

解释你复制粘贴的代码...

self.context = [self context];

//设置self.context的值(一个@property NSManagedObjectContext *context到那个属性的getter。

//这是多余的,因为self.context等于self context] 我建议您查看有关 setter 和 getter 的教程,它们非常有用。

if (self.context == nil)

self.context = [(myAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

//此代码很有用,它将您的 NSManagedObjectContext 设置为存储在您的 AppDelegate 中的 managedObjectContext。

//进入错误本身,这一行是多余的。 NSManagedObjectContext *context = [self managedObjectContext]; 这将创建一个名为 context 的局部实例变量,您真的应该只使用存储的 @propertyself.context

【讨论】:

感谢您的解释 - 它真的很有帮助。显然,要深入了解这些事情,我还有很长的路要走——但是 getter/setter 应该会有所帮助。我的编程背景是,我通常会跳入项目并坐在我的裤子上,直到我让事情正常工作。 :) 你通过解释帮助了很多。 Achievelimitless 基本上说了同样的话——但更简洁。我希望我可以将两者都标记为可接受的答案。 你真的不应该调用应用程序委托来获取托管对象上下文;相反,您应该将其向上传递。值得庆幸的是,Apple 终于将此建议写入他们的文档 developer.apple.com/library/mac/documentation/DataManagement/… @Abizern.. 感谢您提供的信息。我完全没有意识到这一点。我对此有些怀疑。我也发布了this question。请尽可能解释。谢谢【参考方案2】:

首先,在您的myEditPageViewController.h 中添加以下代码行

@property(nonatomic, strong) NSManagedObjectContext *context;

现在将 viewDidLoad 中的代码替换为:

if (self.context == nil)

self.context = [(myAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSManagedObjectContext *context = [self context]; //Not necessary

如果它不起作用,请告诉我。正如我所提到的,您不需要写最后一行,因为您可以直接引用self.context而不是将其分配给其他变量

【讨论】:

谢谢 - 我希望我能标记两个答案 - 因为你的答案和上面的一样。他更广泛地解释了为什么某些事情会做他们所做的事情——所以我给了他答案。但是我给了你我可以的投票,因为你的回答简洁而好。 你真的不应该调用应用委托来获取托管对象上下文;相反,您应该将其向上传递。值得庆幸的是,Apple 终于将此建议写入他们的文档 developer.apple.com/library/mac/documentation/DataManagement/…

以上是关于TabBar 项目 - 表格视图中的核心数据的主要内容,如果未能解决你的问题,请参考以下文章

核心数据项目中的搜索栏

在 tabBar didSelectItem 上加载核心数据的替代方法?还是加快速度?

在表格视图中重新排序按日期排序的单元格项目

重新排列表格视图单元格后如何更新核心数据记录

点击 tabBar 项目应该总是打开第一个视图控制器

Swift 3 - 重新排列并保留表格视图中的单元格