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
的局部实例变量,您真的应该只使用存储的 @property
或 self.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 项目 - 表格视图中的核心数据的主要内容,如果未能解决你的问题,请参考以下文章