获取常量值:无法识别的选择器发送到实例错误

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 会在它们周围加上引号。

以上是关于获取常量值:无法识别的选择器发送到实例错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试获取 AppDelegate 时出现“无法识别的选择器发送到实例”错误

Swift:手势识别器无法识别的选择器发送到实例

错误:无法识别的选择器发送到实例

Swift 3:将无法识别的选择器发送到手势识别器实例

无法识别的选择器发送到实例,UISlider swfit3

[__NSDate 长度]:发送到实例的无法识别的选择器