2010-11-20 68 views
0

我有一个使用ListViewController,DetailViewController和EditingViewController进行编辑的Core Data应用程序。在ListViewController,我有一个复选框的图形,我可以通过在你可以在ListViewController上编辑核心数据吗?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

选择行切换两个图像是否有可能从ListViewController编辑的核心数据记录,这样我可以让我的选择持久?我无法制定出选择记录,编辑和保存值的语法 - 只需从true切换到false即可。

jon

感谢您的及时响应!答案1后的其他信息。您的假设是正确的。我正在CoreData Books示例上对此应用程序进行建模。我没有使用按钮,而是使用两个图像来创建一个选中和未选中的复选框。我添加了一个布尔“检查”到我的实体,重新创建头文件,并将头文件添加到我的ListViewController。这是数据模型头文件的简化版本。

@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"]; 
    } 

然而,这给我的错误“请求成员的东西‘检查’不是一个结构或联合”。我验证了新属性是一个布尔值,并且头文件被导入到ListViewController。有什么想法吗?

最后,这段代码是否消除了将entityObject.check保存到数据库的需要?再次感谢。

+0

因为你没有自定义声明你自己的对象模型类,你可以获取和使用分别下列其值设置:设置使用[entityObject的setValue:[NSNumber的numberWithBool:YES] forKey:@“检查” ]并得到[entityValue valueForKey:@“check”] – Rog 2010-11-21 21:12:53

+0

对不起,它在最后一行读取entityValue的地方应该是entityObject,以防万一你没有想到它。 – Rog 2010-11-21 21:19:16

+0

你想要小心iPhone上的复选框按钮。用户有倾向于双击他们产生错误。这就是为什么滑动开关控制被创建,以便用户可以轻松快速地设置二进制状态。 – TechZen 2010-11-21 21:32:11

回答

1

在我们能够提供更明智的建议之前,了解有关您的应用的更多细节将会很好。我会做一些假设,看它是否有帮助...

首先,在处理Coredata中的BOOL属性时,务必记住它们实际上保存为NSNumbers,所以在需要时记住这一点测试他们的价值,并确保您使用正确的方法。

假设你ListViewController数据是由CoreData填充和你的数据模型定义的实体“实体”与所谓的“最爱” 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

请参阅上面我的问题的附录。 Jon – jon 2010-11-21 18:22:46

+0

因为您还没有自定义声明自己的对象模型类,所以您可以分别使用以下方法获取和设置它们的值:设置use [entityObject setValue:[NSNumber numberWithBool:YES] forKey:@“check”]并获取[entityObject valueForKey:@“check”] – Rog 2010-11-21 21:17:35

+0

请参阅下面的解决方案。 – jon 2010-11-22 02:26:13

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(); 
    } 
}