0

我有 3 个场景,每个场景都收集用户的输入。每个场景有 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 中的指针 *meetings 以保存 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)
4

2 回答 2

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。如果您的目标控制器不是正确的“种类”,您会立即发现。

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

于 2013-02-12T02:15:51.147 回答
0

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

您应该做的是为您之前创建的会议对象发出获取请求。

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

于 2013-02-12T02:17:06.120 回答