【问题标题】:App crashes with setValuesForKeysWithDictionary应用程序因 setValuesForKeysWithDictionary 而崩溃
【发布时间】:2024-05-20 10:50:01
【问题描述】:

我正在使用 setValuesForKeysWithDictionary 来填充我的模型对象。模型对象定义为

@interface Media : NSObject
{
    NSString *userId;
    NSString *mediaType;
}

@property(nonatomic,copy) NSString *userId;
@property(nonatomic,copy) NSString *mediaType;

属性合成的样子,

@implementation Media
@synthesize userId;
@synthesize mediaType;

我初始化类如下,

NSMutableDictionary *dic = [NSMutableDictionary new];
[dic setValue:@"aaa" forKey:@"userId"];
[dic setValue:@"bbb" forKey:@"mediaType"];

Media *obj = [[Media alloc] init];
[obj setValuesForKeysWithDictionary:dic];

这会随着消息而崩溃

'[<Media 0x8a9f280> valueForUndefinedKey:]: this class is not key value coding-compliant    for the key aaa.'

setValuesForKeysWithDictionary: 怎么把我的值当作键??还是我误解了 setValuesForKeysWithDictionary: 函数的目的?

【问题讨论】:

  • 你把这段代码放在哪里?我将下面的代码“并按如下方式初始化类”复制到我的应用程序委托中,并使用您显示的 .h 文件定义了一个新类 Media。对我来说效果很好。
  • 我最初的想法是,它与如何/是否在 Media 的实现中合成属性有关。我无法使用最新版本的 Xcode (4.4.1) 重现您的问题,因为合成是自动完成的。
  • 实际上出于测试目的,我正在 appDelegate 中尝试这个,因为这个问题,我整晚都在分裂头发。太奇怪了。
  • 我使用的是 xCode 4.3.3。有趣的是,如果我将其修改为 [dic setValue:@"userId" forKey:@"userId"]; [dic setValue:@"mediaType" forKey:@"mediaType"]; , 运行没有问题。

标签: iphone objective-c ios cocoa-touch key-value-coding


【解决方案1】:

终于找到答案了。这不是设置值,而是检索部分。我正在使用以下方法从模型中读回值。

-(NSDictionary*) dictionaryRepresentation
{ 
   return [self dictionaryWithValuesForKeys:[NSArray arrayWithObjects:,userId,mediaType,     nil]];
}

如您所见,我使用了普通的变量名而不是键。 @"userId", @"mediaType"。

我最近将 xcode 更改为不同的字体主题,但仍然习惯于新的字体颜色集。感谢大家宝贵的时间。

【讨论】:

    【解决方案2】:

    像这样声明变量时添加@objc 作为前缀。

    class Customer: NSObject
    {
        @objc var name: String?
        @objc var email: String?
    }
    

    它应该可以工作。

    【讨论】:

    • 这看起来很快,与问题无关。