我有三个场景,每个场景收集用户的输入。每个场景都有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)
答案 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