首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CoreData:访问NSManagedObject实例

CoreData:访问NSManagedObject实例
EN

Stack Overflow用户
提问于 2013-02-12 09:56:38
回答 2查看 231关注 0票数 0

我有3个场景,每个场景收集用户的输入。每个场景有5个UITextFields。第四个场景显示了UITableView中的所有15个文本字段。

我不确定这样做是否是最好的方法,但我有以下场景1的代码:

代码语言:javascript
复制
//Meetings is NSManagedObject class. Meetings.h and .m was created from the Meetings entity from Core Data
//I have this code once in the file right before I start saving the data
Meetings *meetings = (Meetings *) [NSEntityDescription insertNewObjectForEntityForName:@"Meetings" inManagedObjectContext:self.managedObjectContext];

// I have similar code below for each user's input.  
 NSString *date = [[NSString alloc] initWithFormat:@"%@", [dateFormatter stringFromDate:selectedDate]];
            DateLabel.text = date;
            [meetings setDateLabel:date];
            ...
            [meetings setTimeLabel:time];
            ..

//Code below is to save.  I have this once at the end of the file to save the data
NSError *error = nil;
if (![managedObjectContext save:&error]) {
    // Handle the error.
}
//The log below shows the saved data fine.  Thus, the data is being saved in managnedObjectContext.
NSLog (@"This is the DateLabel %@", meetings.DateLabel);

问:如何访问场景2和3中的指针*会议,以保存managedObjectContext中的其余字段?

代码语言:javascript
复制
//In Scene 2 viewDidLoad method I did the following to check: 

self.managedObjectContext = [(STAppDelegate *)[[UIApplication sharedApplication]  delegate] managedObjectContext];
Meetings *meetings = (Meetings *) [NSEntityDescription insertNewObjectForEntityForName:@"Meetings" inManagedObjectContext:self.managedObjectContext];
NSLog (@"This is the DateLabel from Scene 2 %@", meetings.DateLabel);

日志显示:

代码语言:javascript
复制
2013-02-11 18:04:05.447 MyApp[3505:c07] This is the DateLabel from Scene 2 (null)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-12 10:15:51

您需要将指向会议对象的指针从前一个屏幕向前传递到下一个屏幕,方法是将它们存储在一个属性中,或者您可以传递对象的id,并根据需要在最后一个屏幕上获取它们。

假设下面的代码反映了你的代码。类名可能不完全相同,但我认为您可以根据需要更改它们。

场景1头文件:

代码语言:javascript
复制
//
//  Scene1ViewController.h
// ... etc.

#import <UIKit/UIKit.h>
#import "Meetings.h"

@interface Scene1ViewController : UIViewController
@property (nonatomic, strong) Meetings *meetingsForScene1;
// ... etc.
@end

Scene 2头文件:

代码语言:javascript
复制
//
//  Scene2ViewController.h
//  ... etc.

#import <UIKit/UIKit.h>
#import "Meetings.h"

@interface Scene2ViewController : UIViewController
@property (nonatomic, strong) Meetings *meetingsFromScene1;
@property (nonatomic, strong) Meetings *meetingsForScene2;
//  ... etc.
@end

meetingsForScene2可能适合也可能不适合,这取决于您的要求。您可以只将数据从Scene2添加到meetingsFromScene1,然后将该实例传递给下一个场景。

Scene 1实现的 -prepareForSegue:sender:**:**

代码语言:javascript
复制
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *destinationViewController = segue.destinationViewController;

    if ([segue.identifier isEqualToString:@"YourSegueIdentifierForTransistionFromScene1ToScene2"]) {
        Scene2ViewController *scene2 = [destinationViewController isKindOfClass:[Scene2ViewController class]] ? (Scene2ViewController *)destinationViewController : nil;

        NSAssert(scene2, @"scene2 should not be nil");
        NSAssert(self.meetingsForScene1, @"self.meetingsForSecen1 should not be nil");

        scene2.meetingsFromScene1 = self.meetingsForScene1;
    }
}

注您可能在Scene2上有两个属性。一个用于当前场景的数据,另一个用于上一个场景的数据。重要的属性是保存前一个场景中的数据的属性。Scene1中的-prepareForSegue:sender:方法适合将Scene1的数据设置为Scene2上的属性。

我已经包含了一些NSAssert调用来做一些检查。考虑在您的生产代码中删除这些代码。另外,请注意在分配*scene2时的检查。如果您的目标控制器不是正确的“类型”,您将立即发现。

我不一定鼓吹这种方法是你的问题的“最佳”,但这种方法至少会提供一条解决方案的途径,如果不能完全解决问题的话。

票数 0
EN

Stack Overflow用户

发布于 2013-02-12 10:17:06

那么,您在viewDidLoad方法中所做的就是在NSManagedObjectContext实例中创建一个新对象。

您应该做的是为以前创建的会议对象发出一个fetch请求。

也许你应该读一读关于核心数据的教程。下面的代码非常容易理解:http://www.raywenderlich.com/934/core-data-on-ios-5-tutorial-getting-started

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14824263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档