如果我只有一个键列表,是否有一种优雅的方法来测试对象的只读与读/写属性?我意识到我可以把钥匙串起来:
NSString *setterString = [@"set" stringByAppendingString:[someKeyString capitalizedString]];
BOOL isReadWrite = [myObject respondsToSelector:NSSelectorFromString(setterString)];
Run Code Online (Sandbox Code Playgroud)
或者更好的是尝试为密钥设置一个值并检查NSUndefinedKeyException- 但是对非异常行为使用异常似乎是不好的形式.
为了清楚起见,我想以编程方式审计对象的属性,并告诉它们之间的区别,例如,
@property (readonly) NSString *someReadOnlyKey
@property NSString *someReadWriteProperty
Run Code Online (Sandbox Code Playgroud)
编辑:为了更清楚,如果将键实现为@propertys或手动getter/setter ,则无关紧要.只关注公共接口.并且感谢您询问我想要实现的目标 - 首先要做到这一点可能更为重要.
我试图勾勒出一些生成对象键的图形表示的代码.所有的密钥都是事先知道的 - 但我不会总是知道哪些密钥可以建立(这取决于特定的子类实现)
我正在尝试用KVC更新一些属性.这些属性已经合成.
这条线有效:
myObject.value = intValue;
Run Code Online (Sandbox Code Playgroud)
这不起作用:
[self setValue:[NSNumber numberWithInt:intValue] forKey:@"myObject.value"];
Run Code Online (Sandbox Code Playgroud)
并且爆发: 由于未捕获的异常'NSUnknownKeyException'终止应用程序,原因:'[<MyViewController 0xd1cec0> setValue:forUndefinedKey:]:此类与密钥myObject.value不符合密码值编码.
然而,该方法(awakeFromNib)的其他实例还可以对setValue:forKey:calls做出很好的响应.唯一的区别是这个特定的实例是在IB中创建和连接的.
我正在开发一个小库,可以让我用对象做一些基本的键值编码.说我有以下对象:
var data = { key1: "value1", key2: { nested1: 1, nested2: "wowza!" } };
Run Code Online (Sandbox Code Playgroud)
我有以下JavaScript函数:
var setData = function(path, value) {
eval("data." + path + "= value;");
};
Run Code Online (Sandbox Code Playgroud)
在使用中:
setData("key1", "updated value1"); // data.key1 == "updated value1"
setData("key2.nested1", 99); // data.key2.nested1 == 99
Run Code Online (Sandbox Code Playgroud)
这是有效的,但是我想在不使用的情况下完成上述操作eval.这是可能的,还是eval最好的方法?
编辑:
注意可以假设您设置的值存在,至少对于路径深度 - 1.我更关心设置现有对象的值.
我有一个XML文件,其中包含商店列表,简化版本如下.我想要帮助的是关于将这些数据移动到Core Data中的存储对象的最简单方法的一些高级想法.我看到关于键值对的建议,但正如您在下面的示例中所看到的,我有相同名称/键的子元素,并且每个商店元素可以有任意数量的这些元素.
我打算在应用程序中存储这些对象以供将来使用(它们将在地图上注释).因此,需要存储每个重复的字段,其中一个是不够的.我知道如何在核心数据中对其进行建模我相信,我将拥有一个电话号码实体和一个商店实体,并将基于这两者联系起来<store-id>.我只是尝试使用一种简单的方法通过其他数据结构将它们从XML移动到Core Data.
XML示例:
<stores>
<store>
<store-id>1</store-id>
<city>Dublin</city>
<phone>011234567</phone>
<phone>011234566</phone>
<owner>Joe Bloggs</owner>
</store>
<store>
<store-id>2</store-id>
<city>Cork</city>
<phone>019876543</phone>
<phone>019876542</phone>
<owner>Joe Bloggs</owner>
</store>
<stores>
Run Code Online (Sandbox Code Playgroud)
如果键值对是要走的路,请指出我可以考虑重复元素的方法.如果还有另一种方式,我会全力以赴.
谢谢
我有一些自动反序列化代码,它将使用KVC设置对象的属性.我需要为基元(int,double,float)添加反序列化支持,但我无法(或不确定如何)使用带有基元的" setValue:forKey: ".必须在运行时执行属性查找.有任何想法吗?谢谢.
我有以下代码:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[defs setObject:[NSNumber numberWithInt:100] forKey:@"test1.test2.test3"];
[defs setValue:[NSNumber numberWithInt:10] forKeyPath:@"test2.test3.test4"];
Run Code Online (Sandbox Code Playgroud)
据我所知,它setObject:forKey:创建了"test1.test2.test3"键和给定数字对象之间的关联.另一方面,setValue:forKeyPath:Key-Value-Coding方法试图找到路径"test2.test3.test4"的对象,但最后,它只是默默地做什么.它甚至没有修改字典!
令我困惑的是,setValue:forKeyPath:它不会引发任何异常,也不会报告任何错误.为什么是这样?这种行为记录在哪里吗?
我正在阅读文档,说明setValue:forKey:会将NULL值视为被删除.然而,我有一个例如以下一直在崩溃的例子:
[myObj setValue:[aDictionary valueForKey:@"keyDoesNotExist"] forKey:@"anotherKey"];
如果aDictionary不包含密钥,这行代码会崩溃keyDoesNotExist.那有什么办法吗?在这里做什么是合适的?
myObj是一个实例NSManagedObject."anotherKey"是一对多的关系,myObj可以包含许多"anotherKey".
当该属性是CGRect时,如何设置实例的属性.我想做这个:
CGRect rect = CGRectFromString(value);
[localClassObjectInstance setValue:rect forKey:key];
Run Code Online (Sandbox Code Playgroud)
但编译器不喜欢setValue; 它说我将CGRect发送到不兼容类型'id'的参数.
谢谢
我正在尝试使用KVC来检索使用Core数据构建的自定义NSManagedObject实体的属性值.我在尝试访问几层深处的属性时遇到UnknownKeyException,而对于我的生活,我无法弄清楚为什么......
根实体称为"Catch".它有许多属性:权重,长度等.它还与另一个称为"物种"的实体有一对一的关系.Species有一个名称属性,定义为NSString.
所以:
//this will output the species name (i.e. "Brook Trout")
NSLog(@"Catch.species.name = %@", catch.species.name);
//this will throw a NSUnknownKeyException
NSLog(@"Catch.species.name = %@", [catch valueForKey:@"species.name"]);
//but this works...!?
Species *species = (Species*)[catch valueForKey:@"species"];
NSLog(@"Species.name = %@", species.name);
Run Code Online (Sandbox Code Playgroud)
具体的例外细节是:
*由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[valueForUndefinedKey:]:实体Catch不是密钥值编码兼容的密钥"species.name".
有谁比我更了解这些东西知道发生了什么事吗?
提前致谢!
可能重复:
为什么我的对象不符合键值编码?
我有一个字典,我想将键/值添加到自定义类,但我总是得到错误,该类不符合KVC,但Apple文档声明它应该是.
我的代码:
ContactObject.h:
@interface ContactObject : NSObject
+ (ContactObject *)testAdding;
@end
Run Code Online (Sandbox Code Playgroud)
ContactObject.m:
@implementation ContactObject
- (id)init {
self = [super init];
if (self) {
// customize
}
return self;
}
+ (ContactObject *)testAdding
{
// create object
ContactObject *theReturnObject = [[ContactObject alloc] init];
[theReturnObject setValue:@"Berlin" forKey:@"city"];
[theReturnObject setValue:@"Germany" forKey:@"state"];
return theReturnObject;
}
@end
Run Code Online (Sandbox Code Playgroud)
我想我错过了一些非常愚蠢的东西:)
请,任何帮助表示赞赏......
问候,马提亚
key-value-coding ×10
objective-c ×8
cocoa ×4
cocoa-touch ×2
core-data ×2
ios ×1
ios5 ×1
iphone ×1
javascript ×1
kvc ×1
nsobject ×1
object ×1
xml ×1