我有一个Core Data应用程序设置了ListViewController,DetailViewController和EditingViewController,大多数编辑都在这里进行。在ListViewController上,我有一个复选框的图形,我可以通过选择
中的行来切换两个图像- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
是否可以从ListViewController编辑Core Data记录,以便我可以选择持久化?我无法弄清楚选择记录,编辑和保存值的语法 - 这将只是从true切换到false。
乔恩
感谢您的快速回复!答案后的其他信息1.您的假设是正确的。我正在使用CoreData Books示例对此应用程序进行建模。我没有使用按钮,而是使用两个图像来创建一个选中和未选中的复选框。我向我的实体添加了一个布尔“check”,重新创建了头文件,并将头文件添加到了我的ListViewController中。这是datamodel头文件的简化版本。
@interface Patient : NSManagedObject
{
}
@property (nonatomic, retain) NSString * location;
@property (nonatomic, retain) NSNumber * check;
@property (nonatomic, retain) NSString * lastName;
@end
这是我对你的代码的修改:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
NSManagedObject *entityObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
if (![entityObject.check boolValue]) {
entityObject.check = [NSNumber numberWithBool:YES];
cell.imageView.image = [UIImage imageNamed:@"check.png"];
}
else {
entityObject.check= [NSNumber numberWithBool:NO];
cell.imageView.image = [UIImage imageNamed:@"uncheck.png"];
}
然而,这给了我错误“请求成员'检查'的东西,而不是结构或联合”。我验证了new属性是一个布尔值,并且头文件被导入ListViewController。有什么想法吗?
最后,此代码是否消除了将entityObject.check保存到数据库的需要?再次感谢。
答案 0 :(得分:1)
在我们提供更明智的建议之前,最好先了解一下您的应用的详细信息。无论如何,我会做出一些假设,看它是否有帮助...
首先,在Coredata中处理BOOL属性时,重要的是要记住它们实际上保存为NSNumbers,因此在需要测试它们的值并确保使用正确的方法时请记住这一点。
假设您的ListViewController中的数据正由CoreData填充,并且您的数据模型定义了一个实体“Entity”,其属性类型为BOOL,称为“收藏夹”,您可以尝试以下操作:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
NSManagedObject *entityObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
if (![entityObject.favourite boolValue]) {
entityObject.favourite = [NSNumber numberWithBool:YES];
[self.yourToggleButton setSelected:YES]; // this assumes your checkbox is a UIButton and you want its view to be updated to checked when your BOOL == YES
}
else {
entityObject.favourite = [NSNumber numberWithBool:NO];
[self.watchListButton setSelected:NO];
}
以上假设您有一个fetchedResultsController,它也负责从您的CoreData数据库中获取数据。如果不是,我强烈建议您查看Apple的一个教程(CoreData Books和CoreData Recipes),了解它们的工作方式,因为它会让您的生活更轻松 - NSFetchedResultsController使您可以非常直接地保持数据在不同视图之间同步,这是您将不得不特别考虑的事项,因为您允许在不同的视图控制器中编辑不同的属性。
我希望这有帮助,但如果需要,可以随意提出任何其他问题。 干杯, ROG
答案 1 :(得分:0)
我提出了一个稍微不同的解决方案,但Rog的帖子肯定让我走上正轨。我在布尔语法方面遇到了一些麻烦,因此我将实体属性更改为字符串并改为使用“N”和“Y”。我还发现我需要保存值以使其持久化。我很感激帮助。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Establish connections
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
Patient *patient = [self.fetchedResultsController objectAtIndexPath:indexPath];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
// Toggle images and check value with each row tap
if ([patient.check isEqualToString: @"N"] == YES) {
cell.imageView.image = [UIImage imageNamed:@"check.png"];
patient.check = @"Y";
}
else {
cell.imageView.image = [UIImage imageNamed:@"uncheck.png"];
patient.check = @"N";
}
// Save check value
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}