获取常量值:无法识别的选择器发送到实例错误
Posted
技术标签:
【中文标题】获取常量值:无法识别的选择器发送到实例错误【英文标题】:Getting constantValue: unrecognized selector sent to instance error 【发布时间】:2011-08-13 21:08:06 【问题描述】:我的 fetch 谓词出现此错误
2011-08-13 13:49:12.405 Codes[16957:10d03] NSlog Array: code BETWEEN "06", "07"
2011-08-13 13:49:12.407 Codes[16957:10d03] -[NSCFString constantValue]: unrecognized selector sent to instance 0x7464610
2011-08-13 13:49:12.409 Codes[16957:10d03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString constantValue]: unrecognized selector sent to instance 0x7464610'
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"ANY code BETWEEN %@", [NSArray arrayWithObjects:self.predicateFilterStart, self.predicateFilterEnd, nil]];:
NSLog 显示code BETWEEN "06", "07"
具有属性code
的 NSManagedObject 的模型类:
@interface MedicalCode : NSManagedObject
@property (nonatomic, retain) NSString * code;
@property (nonatomic, retain) NSString * codeDescription;
@property (nonatomic, retain) NSString * name;
FRC 方法:(ICD9Procedure 是 MedicalCode 的子类)
- (NSFetchedResultsController *)fetchedResultsController
if (__fetchedResultsController != nil)
return __fetchedResultsController;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ICD9Disease" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"ANY code BEGINSWITH[c] %@", self.predicateFilter];
[fetchRequest setPredicate:myPredicate];
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"code" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
return __fetchedResultsController;
编辑:
我只需要一个过滤数据的谓词。
我有一个名为代码的实体的属性,其格式类似于55.534
。
我正在尝试获取某个范围内的所有数据,例如 50-60。
【问题讨论】:
【参考方案1】:试试:
NSString *start = @"06";
NSString *end = @"07";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY code BETWEEN %@",
[NSArray arrayWithObjects: start, end, nil]];
NSLog(@"%@", pred);
这对我有用:
2011-08-13 23:45:52.019 PredicateTest[18493:707] ANY code BETWEEN "06", "07"
所以错误可能在属性中。
FWIW,constantValue
是 NSExpression 的一种方法。不确定这是否对您有帮助。
我看到您更新了代码。现在非常不清楚您的错误发生在哪里,因为您最初发布的代码没有出现在您添加的代码中,也没有提供有关您正在使用的属性的其他信息。
你说错误没有出现在你最初发布的代码中。它发生在您现在发布的另一段代码中,但我不清楚这与原始代码有何关系。
更新
显然,根据 cmets 中的讨论,事实证明您需要数字,因此请执行以下操作:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY code BETWEEN %@",
[NSArray arrayWithObjects:
[NSNumber numberWithDouble: 50.0],
[NSNumber numberWithDouble: 60.0],
nil]];
最终解决方案
对于那些感兴趣的人:以下显然有效。
NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY code BETWEEN %@",
[NSArray arrayWithObjects:
[NSExpression expressionForConstantValue: [NSNumber numberWithDouble: 50.0]],
[NSExpression expressionForConstantValue: [NSNumber numberWithDouble: 60.0]],
nil]];
【讨论】:
正如我所说,请向我们展示更多:您使用的属性的类型和初始化。可能是错误的属性代码。 如果你这样做:NSString *start = @"06"; NSString *end = @"07"; ... arrayWithObjects: start, end, nil];
会怎样? (注释掉你的真实代码并临时添加)。还请显示您的 NSLog 调用(不仅仅是结果)。换句话说:提供更多信息,以便人们可以帮助您。
Hey Rudy,我已经在您请求时在上面发布了更多代码。你发布的代码我也遇到了同样的崩溃。
你指的NSLog是我刚刚NSLog@"NSlog Array:%@", filterPredicate);
的时候。错误总是发生在if (![self.fetchedResultsController performFetch:&error])
。
如果是字符串,使用[NSNumber numberWithFloat: [myString floatValue]]
。你不能直接传递字符串,因为 NSPredicate 会在它们周围加上引号。以上是关于获取常量值:无法识别的选择器发送到实例错误的主要内容,如果未能解决你的问题,请参考以下文章