在我的核心数据实体中,有一个名为validity的Integer 32类型的属性。
先前使用此方法创建了两个对象:
- (void) AddMandatoryItems
{
NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *newMonitorItem = [NSEntityDescription
insertNewObjectForEntityForName:@"MonitorItem"
inManagedObjectContext:context];
//
// Other codes here
//
[newMonitorItem setValue:[NSNumber numberWithInt:35]
forKey:@"validity"];
[self.monitorItemArray addObject:newMonitorItem];
NSError *error = nil;
if (![context save:&error])
{
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
//
// other codes here
//
[newMonitorItem setValue:[NSNumber numberWithInt:90]
forKey:@"validity"];
[self.monitorItemArray addObject:newMonitorItem];
if (![context save:&error])
{
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
// Return the number of rows in the section.
}
第一个和第二个对象的有效值分别为35和90.
这两个值的加载方式如下:
- (void)viewDidLoad
{
//
// Other codes here
//
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MonitorItem"];
self.monitorItemArray = [[managedObjectContext
executeFetchRequest:fetchRequest
error:nil] mutableCopy];
NSLog(@"viewDidLoad.monitorItemArray[1].validity: %d", (int)[self.monitorItemArray[1] valueForKey:@"validity"]);
}
NSLog的结果如下所示:
2014-05-14 14:55:15.939 SGRecencyMonitor [3086:70b] viewDidLoad.monitorItemArray [1] .validity:1442
如图所示,该值应为90而不是1442.但是,检查下面的cellForRowAtIndexPath方法会返回正确的结果:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
NSManagedObject *monitorItem = [self.monitorItemArray objectAtIndex:indexPath.row];
//
// code to display each row here
//
NSLog(@"ItemViewController tableview cellForRowAtIndexPath Validity: %@", [monitorItem valueForKey:@"validity"]);
return cell;
}
结果如下:
2014-05-14 14:55:15.948 SGRecencyMonitor [3086:70b] ItemViewController tableview cellForRowAtIndexPath有效期:90
有人可以向我解释为什么我无法使用[self.monitorItemArray [1] valueForKey:@“validity”获得正确的结果我正在使用此方法将对象self.monitorItemArray传递给另一个视图。我无法通过它检索正确的值。以下是segue方法
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"UpdateView"])
{
NSManagedObject *selectedItem = [self.monitorItemArray objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];
ItemUpdateViewController *destViewController = segue.destinationViewController;
destViewController.ItemReceived = selectedItem;
}
}
我做错了什么?谢谢
答案 0 :(得分:1)
在第一个实例中,您使用%d
作为格式说明符 - 这需要一个整数,但是您传递NSNumber
这是一个对象。您正在查看对象内存地址的整数。在第二个实例中,您使用%@
,它需要一个对象,并且您正在查看NSNumber
description
方法的结果,只打印出数字值。
将第一个格式说明符更改为%@
或从数字对象传递integerValue
。
答案 1 :(得分:0)
试试这个:
- (void)viewDidLoad
{
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MonitorItem"];
self.monitorItemArray = [[managedObjectContext
executeFetchRequest:fetchRequest
error:nil] mutableCopy];
NSNumber *n = [self.monitorItemArray[1] valueForKey:@"validity"];
NSLog(@"viewDidLoad.monitorItemArray[1].validity: %d", [n intValue]);
}
// it works for me