我正在学习如何使用核心数据。我有一个应用程序,填写标记为User的实体的所有变量。然后,我将这些用户加载到表中。此时,可以选择用户并将其推送到新的视图控制器,此时我生成所选用户的PDF文件。所以我认为我误解了我必须传递给视图控制器才能访问表中选择的核心数据。这是我在表视图控制器中的内容。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.spinner startAnimating];
ReportPDFViewController *reviewViewController = [[ReportPDFViewController alloc] init];
reviewViewController.userInfo = [[self.fetchedResultsController fetchedObjects] objectAtIndex:indexPath.row];
[self.navigationController pushViewController:reviewViewController animated:YES];
}
然后下一个视图说明了这个
- (void)viewDidLoad
{
[super viewDidLoad];
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithTitle:@"Email PDF"
style:UIBarButtonItemStylePlain
target:self
action:@selector(emailPDF)];
self.navigationItem.rightBarButtonItem = barButton;
TrafficSignalProAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];
// Do any additional setup after loading the view.
NSEntityDescription *entitydesc = [NSEntityDescription entityForName:@"User" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entitydesc];
NSError *error;
NSArray *matchingData = [userInfo executeFetchRequest:request error:&error];
NSString *Intersection;
NSString *currentDay;
for (NSManagedObject *obj in matchingData) {
Intersection = sendIntersection;
currentDay = sendDate;
}
NSString* fileName = [self getPDFFileName];
[PDFRenderer drawPDF:fileName intersectionSearch:Intersection dateSearch:currentDay];
[self showPDFFile];
self.navigationItem.title = @"Report";
}
所以我试图传递所选行的NSManagedObjectContext然后加载。那之后我真的迷路了。我不确定传递托管对象上下文是否正确,如果是,我不知道ReportPDFViewController中的代码有什么问题。我查看了所有可以找到的教程。我的编程背景有限,所以非常感谢任何帮助。
答案 0 :(得分:1)
reviewViewController.userInfo = [[self.fetchedResultsController fetchedObjects] objectAtIndex:indexPath.row];
这将userInfo设置为NSManagedObject(或子类)类型的对象。
NSArray *matchingData = [userInfo executeFetchRequest:request error:&error];
这是使用userInfo,就像它是NSManagedObjectContext一样。我想你会在这里得到一个无效的选择器错误。
userInfo属性的实际类型是什么?它应该是NSManagedObject。
您无需在viewDidLoad
中执行抓取请求。核心数据不是数据库。每次需要某些信息时,您并不总是需要执行获取请求。一旦拥有了托管对象,就可以在没有获取请求的情况下获取与之相关的信息。如果你为它设置了一个自定义类,你可以将它看作是一个常规的Objective-C对象。
for (NSManagedObject *obj in matchingData) {
Intersection = sendIntersection;
currentDay = sendDate;
}
这段代码没有意义。您正在循环,但每次通过您为变量分配相同的值。我不知道该值是什么,因为sendIntersection
和sendDate
未在您发布的代码中的任何其他位置引用。在任何情况下,你都没有使用获取请求的结果。
我会猜测你需要做什么:
Intersection = [userInfo valueForKey:@"intersection"];
currentDay = [userInfo valueForKey:@"date"];
这是一个总猜测,因为我不知道你的数据模型是什么。不需要循环,因为您只需要一个用户对象。