使用NSPredicate过滤基于超类中的NSInteger属性的对象数组

时间:2013-04-16 11:23:42

标签: objective-c nsarray nspredicate kvc

我已经完成了以下设置:

@interface Item : NSObject {
    NSInteger *item_id;
    NSString *title;
    UIImage *item_icon;
}

@property (nonatomic, copy) NSString *title;
@property (nonatomic, assign) NSInteger *item_id;
@property (nonatomic, strong) UIImage *item_icon;

- (NSString *)path;

- (id)initWithDictionary:(NSDictionary *)dictionairy;

@end

#import <Foundation/Foundation.h>
#import "Item.h"

@interface Category : Item {

}

- (NSString *)path;

@end

我有一个包含类别实例的数组(称为&#39;类别&#39;),我希望根据它的item_id取出一个项目。这是我用于此的代码:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"item_id == %d", 1]; 
NSArray *filteredArray = [categories filteredArrayUsingPredicate:predicate];

这会导致以下错误:

  

* 由于未捕获的异常终止应用&#39; NSUnknownKeyException&#39;,原因:&#39; [valueForUndefinedKey:]:此类是   密钥item_id不符合密钥值编码。&#39;

我该如何解决这个问题以及我做错了什么?这些属性是合成的,我可以在Category实例上成功访问和设置item_id属性。

3 个答案:

答案 0 :(得分:4)

您已将item_id属性声明为指针。但NSInteger是标量类型(32位或64位整数),因此您应将其声明为

@property (nonatomic, assign) NSInteger item_id;

备注:从LLVM 4.0编译器(Xcode 4.4)开始,@synthesize和实例变量都会自动生成。

答案 1 :(得分:3)

首先,NSArray不能包含原始类型的对象,如1,2,3。但是,确实包含对象。因此,在创建谓词时,您应该以与获取对象相同的方式创建谓词。上面的谓词应该改为像这样的东西才能发挥作用;

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"item_id == %@", @(1)];

答案 2 :(得分:3)

NSString *str = [NSString stringWithFormat:@"%i",yourIntVariable];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"item_id == %@", str]; 
NSArray *filteredArray = [categories filteredArrayUsingPredicate:predicate];