4

我有以下设置:

@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

我有一个包含类别实例(称为“类别”)的数组,我想根据它的 item_id 取出单个项目。这是我使用的代码:

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

这会导致以下错误:

*由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[valueForUndefinedKey:]:此类与键 item_id 的键值编码不兼容。”

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

4

3 回答 3

4

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

@property (nonatomic, assign) NSInteger item_id;

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

于 2013-04-16T11:47:33.977 回答
3

第一件事是 NSArray 不能包含原始类型的对象,如 1、2、3。但是,确实包含对象。因此,当您创建谓词时,您应该以与它获取对象相同的方式创建它。上面的谓词应该改成这样才能起作用;

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"item_id == %@", @(1)];
于 2013-04-16T11:28:31.953 回答
3
NSString *str = [NSString stringWithFormat:@"%i",yourIntVariable];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"item_id == %@", str]; 
NSArray *filteredArray = [categories filteredArrayUsingPredicate:predicate];
于 2013-04-16T11:38:04.793 回答