【问题标题】:TabBar Project - Core Data in a tableviewTabBar 项目 - 表格视图中的核心数据
【发布时间】: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];

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

【问题讨论】:

    标签: ios uitableview core-data uiviewcontroller


    【解决方案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/…
    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多