CoreData:访问NSManagedObject的实例

时间:2013-02-12 01:56:38

标签: ios core-data pointers

我有三个场景,每个场景收集用户的输入。每个场景都有5个UITextField。第4个场景显示UITableView中的所有15个文本字段。

我不确定这是否是执行此操作的最佳方法,但我对场景1有以下代码:

//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中的其余字段?我在场景2中做了一个NSLog,它显示为Null:

//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);

日志显示:

2013-02-11 18:04:05.447 MyApp[3505:c07] This is the DateLabel from Scene 2 (null)

2 个答案:

答案 0 :(得分:0)

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

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

场景1标题文件:

//
//  Scene1ViewController.h
// ... etc.

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

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

场景2页眉文件:

//
//  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并将该实例传递到下一个场景。

场景1实施-prepareForSegue:sender:

- (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时注意检查。如果您的目标控制器不是正确的“类型”,您将立即找到。

我并不一定主张将此方法作为您问题的“最佳”,但如果不能完全解决问题,这种方法至少会提供解决方案的途径。

答案 1 :(得分:0)

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

您应该做的是为之前创建的Meetings对象提取获取请求。

也许您应该阅读有关Core Data的教程。以下内容非常易于理解:http://www.raywenderlich.com/934/core-data-on-ios-5-tutorial-getting-started