有没有办法访问NSArray元素valueForKeyPath?例如,Google的反向地理编码器服务会返回一个非常复杂的数据结构.如果我想要进入这个城市,那么现在我必须把它分成两个电话,像这样:
NSDictionary *address = [NSString stringWithString:[[[dictionary objectForKey:@"Placemark"] objectAtIndex:0] objectForKey:@"address"]];
NSLog(@"%@", [address valueForKeyPath:@"AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName"]);
Run Code Online (Sandbox Code Playgroud)
只是想知道是否有办法将objectAtIndex:调用塞入valueForKeyPath字符串.我尝试了像@"Placemark [0] .address"这样的javascript-esque配方,但没有骰子.
我正在编写我的第一个iPhone应用程序,所以我还没有找到很多调试方法.基本上我的应用程序显示图像,触摸时播放短暂的声音.在XCode中编译和构建项目时,一切都成功构建,但是当应用程序在iPhone模拟器中运行时,它会崩溃.
我收到以下错误:
Application Specific Information:
iPhone Simulator 1.0 (70), iPhone OS 2.0 (5A331)
*** Terminating app due to uncaught exception 'NSUnknownKeyException',
reason: '[<UIView 0x34efd0> setValue:forUndefinedKey:]: this class is not key value
coding-compliant for the key kramerImage.'
Run Code Online (Sandbox Code Playgroud)
kramerImage这里是我用于背景的图像.
我不确定NSUnknownKeyException是什么意思,或者为什么该类不是密钥值编码兼容的密钥.
我想valueForKeyPath在my 上使用NSDictionary,但问题是其中一个键是一个以@符号开头的字符串.我无法控制密钥的命名.
我在尝试创建密钥路径时遇到问题,因为我收到格式异常,即使在尝试转义@符号时也是如此:
这很好用:
[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"]
Run Code Online (Sandbox Code Playgroud)
但是这些都不起作用:
[dict valueForKeyPath:@"key1.@specialKey.key3"]
[dict valueForKeyPath:@"key1.@@specialKey.key3"]
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
谢谢,
麦克风
我试图更好地理解Cocoa的键值编码(KVC)机制.我已经阅读了Apple的Key-Value Programming Guide,但对于某些KVC方法如何搜索密钥仍然有点困惑.特别是mutableArrayValueForKey : .
下面我将解释我如何理解valueForKey:KVC"getters"的工作方式.然后我将讨论有关mutableArrayValueForKey的问题.
有七种不同的"getter"KVC方法:
- (id)valueForKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
- (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
- (NSMutableSet *)mutableSetValueForKey:(NSString *)key;
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;
Run Code Online (Sandbox Code Playgroud)
在Property中搜索Value(名为myKey)时,Apple的文档声明valueForKey:这样搜索:
-getMyKey,-myKey和-isMyKey(按此顺序)如果没有找到,它会尝试这些有序的,多对多的getter(NSArray):
// Required:
- (NSUInteger)countOfMyKey;
// Requires At Least One:
- (id)objectInMyKeyAtIndex:(NSUInteger)index;
- (NSArray *)myKeyAtIndexes:(NSIndexSet *)indexes;
// Optional (improves performance):
- (void)getMyKey:(KeyClass **)buffer range:(NSRange)inRange;
Run Code Online (Sandbox Code Playgroud)接下来,它尝试这些无序的,多对多的getter(NSSet):
- (NSUInteger)countOfMyKey;
- (NSEnumerator *)enumeratorOfMyKey; …Run Code Online (Sandbox Code Playgroud)是否可以定义自己的关键路径运算符,例如@ avg,@ sum等...
我创建了一个具有float属性的NSView子类,我想在Interface Builder中设置它.在"用户定义的运行时属性"部分中,唯一合适的类型是"数字".但是如果我想输入一个十进制数(使用.或者作为分隔符),它只会舍入到最接近的整数.这是一个错误还是故意的?如何定义浮点数而不是整数?
我有一个自定义UITableView子类,我在其中重写+accessInstanceVariablesDirectly以返回NO以确保无法使用KVC设置没有setter的属性.
从视图层次结构中删除此表视图时,应用程序崩溃 - 有时 - 现在是奇怪的部分:仅当启用了辅助功能时!(即,可访问性检查器可见,或者您在物理设备上启用了辅助功能)
如果我不覆盖+accessInstanceVariablesDirectly,一切正常.我想可能UITableView依赖于直接访问一些实例变量 - 但是如果我可以通过使用它来破坏超类,那么这个方法有什么意义呢?有没有办法指定每个属性的这种行为,比如+automaticallyNotifiesObserversForKey:?但是,只有在启用"辅助功能"时才会出现此问题,我感到困惑.
我尝试用各种仪器分析项目,但没有成功.
你可以在这里找到一个复制问题的最小项目.我非常感谢有关为什么会发生这种情况或如何实现我想要的东西的任何指示.
A有一些NSValue(通过KVC获得valueForKey)我需要附加到一个NSData对象,以便使用Game Center通过网络发送它.显然,我还需要将NSValue背面转换NSData为更多的KVC(setValue:forKey:).
我不知道每一个确切的类型NSValue,所以我仅限于使用所提供的接口NSValue和NSData.我应该提一下,NSValue它们永远不是指针类型.
我很惊讶没有[NSData dataWithValue:value],也没有[value dataWithEncoding:]类似的东西.但也许我是盲目的,没有看到明显的选择.我考虑过使用getValue:将值复制到void*缓冲区中,但除了使用objCType并将其与所有可能的类型进行比较之外,我应该如何确定缓冲区长度?
我该怎么办呢?
注意:
NSKeyedArchiver这是不可能的,因为它非常低效.4字节浮点数归档为142字节NSData,8字节CGPoint归档时使用260字节NSData.将发送的数据量保持在最低限度对我正在做的事情至关重要.
这个例子是人为的,但它表明了我的观点.
所以,如果我有一个如下的对象图:
{
sex = male;
uid = 637650940;
work = ({
employer = {
id = 116420715044499;
name = "Software Engineer";
};
"end_date" = "0000-00";
"start_date" = "0000-00";
}, {
employer = {
id = 188733137832278;
name = "Apple";
};
});
},
//Some more objects
Run Code Online (Sandbox Code Playgroud)
(这是一个包含NSDictionarys的NSArray,它具有NSArray类型的对象).
关键领域是work.我想要一个关键路径,它将获取work数组中的第一个对象.
如果我这样做:
NSArray* work = [outerArrayObject objectForKey: @"work"];
id name = [work valueForKeyPath: @"employer.name"];
Run Code Online (Sandbox Code Playgroud)
我得到一个包含每个名字的数组(在上面的例子中,软件工程师和Apple).是否有一个集合运算符或某些东西可以返回第一个对象?如果您可以通过start_date开发一个关键路径来对每个工作进行排序,那么奖励积分:)
当我使用Interface Builder将控件绑定到NSArrayController时,绑定检查器中的"Controller Key"字段下有各种选项.
我理解"arrangeObjects"是什么,我半理解"选择"是什么,但我很想看到所有选项的真正好解释以及何时使用每个选项.该列表包括:selectionIndexes,selectionIndex,selectedObject,sortDescriptors等.我无法找到这些选项的良好解释.
我遇到了一个绑定目标>选择按钮的问题,所以我希望更深入地了解这些控制器键可能会帮助我调试我的问题.
谢谢!!!
macos cocoa interface-builder key-value-observing key-value-coding
key-value-coding ×10
objective-c ×6
cocoa ×4
iphone ×2
ios ×1
kvc ×1
macos ×1
nscoding ×1
nsdata ×1
nsdictionary ×1
uitableview ×1
xcode ×1
xib ×1