我正在使用KVC来迭代几个视图.设置BOOL属性时遇到问题:
[self setValue:YES forKeyPath:[NSString stringWithFormat:@"myView%d.userInteractionEnabled", n]];
Run Code Online (Sandbox Code Playgroud)
我得到:警告:传递'setValue:forKeyPath:'的参数1使得整数指针没有强制转换.
我找不到[NSValue valueWithBool:YES]或类似的东西.
该怎么办?
运行这个:
@try
{
NSLog(@"1. autocapitalizationType = %d", [self.textField autocapitalizationType]);
NSLog(@"2. autocapitalizationType = %@", [self.textField valueForKey:@"autocapitalizationType"]);
}
@catch (NSException *exception)
{
NSLog(@"3. %@", exception);
}
Run Code Online (Sandbox Code Playgroud)
输出:
1. autocapitalizationType = 0
3. [<UITextField 0x6c15df0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key autocapitalizationType.
Run Code Online (Sandbox Code Playgroud)
我在期待:
1. autocapitalizationType = 0
2. autocapitalizationType = 0
Run Code Online (Sandbox Code Playgroud)
只有作为UITextInputTraits协议一部分的属性才会发生此异常.可以访问此类的常规属性.UITextFieldclearButtonModevalueForKey:
那么为什么不能通过UITextInputTraits键值编码访问属性呢?
我是否应该害怕使用键值观察(KVO)和NSNotifications?我开始在我的应用程序中使用它们,但我有点不熟悉可能触发appwide调用或自动执行某些操作的概念,并且有点害怕这种开销可能带来的性能损失.
我的担忧没有根据吗?我应该像其他方法一样使用它们吗?它们看起来非常方便并且填补了很多空白,所以我想尽可能使用它们.注意:我主要是为iOS设备编程,因此性能始终是我关注的问题.
iphone cocoa key-value-observing key-value-coding nsnotifications
为什么我不能观察editing实例的属性UITableViewController?
我正在使用以下代码:
[self addObserver:self
forKeyPath:@"editing"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
context:NULL];
Run Code Online (Sandbox Code Playgroud)
并实施了该方法:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
Run Code Online (Sandbox Code Playgroud)
...但是observeValueForKeyPath当该值改变时,永远不会调用该方法.
根据Apple的" 确保KVC合规性"部分:
对于属性或一对一关系的属性,这需要您的类:
- 实现名为
-<key>,,-is<Key>或具有实例变量<key>或的方法_<key>.- 如果属性是可变的,那么它也应该实现
-set<Key>:.- 您的
-set<Key>:方法实现不应执行验证.-validate<Key>:error:如果验证适合密钥,则应该实现您的类.
该editing属性的文档声明它被定义为:
@property(nonatomic, getter=isEditing) BOOL editing
Run Code Online (Sandbox Code Playgroud)
由于此属性不可变,因此它必须符合的唯一要点是第一个(-is<Key>例如,定义了一个方法).您可以通过查看属性声明并注意到已isEditing定义方法来确定它是否符合此要求.因此,它应该符合Key Value Observing.怎么不工作?
cocoa-touch objective-c key-value-observing key-value-coding uikit
UIButton有一个州财产,所有账户似乎都符合KVO标准,没有其他文件说明.但是,当我向UIButton的state属性添加一个观察者时,从未调用过观察者回调.怎么会?
我正在使用键值编码来获取iTunes中的所有艺术家:
[self.iTunes valueForKeyPath:@"sources.@distinctUnionOfArrays.playlists.@distinctUnionOfArrays.tracks.artist"];
Run Code Online (Sandbox Code Playgroud)
现在,这很好用.这非常有效.我也想对专辑做同样的事情.
[self.iTunes valueForKeyPath:@"sources.@distinctUnionOfArrays.playlists.@distinctUnionOfArrays.tracks.album"];
Run Code Online (Sandbox Code Playgroud)
这里的问题是,有多个相同名称的专辑,但不一定是同一个艺术家.有没有办法获得每张专辑的歌曲,所以我可以找出它是什么艺术家,并获得它的封面?我知道有NSPredicate,但这很慢.
具体代码并不重要,我只需要键值编码部分.
谢谢!
好吧,这让我疯了 - 请告诉我,我不会失去理智!
我宣布:
NSMutableDictionary* generalSettingsDict;
Run Code Online (Sandbox Code Playgroud)
我的.h
我初始化:
generalSettingsDict = [[NSMutableDictionary alloc] initWithCapacity:5];
Run Code Online (Sandbox Code Playgroud)
在viewWillAppear中
我设置:
[generalSettingsDict setValue:[NSNumber numberWithBool:control.on]
forkey:[NSNumber numberWithInt:control.tag]];
Run Code Online (Sandbox Code Playgroud)
在一个方法中:
-(void)settingChanged:(UISwitch*)control forEvent:(UIEvent *)event
Run Code Online (Sandbox Code Playgroud)
我得到"NSMutableDictionary可能无法响应setValue:forkey:"并且应用程序在运行时崩溃.
请帮忙 :(
debugging objective-c key-value-observing key-value-coding nsmutabledictionary
我有一个json字符串
{"name":"test","bar":{"name":"testBar"}}
Run Code Online (Sandbox Code Playgroud)
在目标c中我有一个对象
@interface Foo : NSObject {
}
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) Bar * bar;
@end
Run Code Online (Sandbox Code Playgroud)
我只是综合了这些属性.我有一个具有综合属性的子对象.
@interface Bar : NSObject {
}
@property (nonatomic, retain) NSString * name;
@end
Run Code Online (Sandbox Code Playgroud)
然后这里是我试图进入Foo对象的代码,其中响应是上面的json字符串:
SBJsonParser *json = [[SBJsonParser new] autorelease];
parsedResponse = [json objectWithString:response error:&error];
Foo * obj = [[Foo new] autorelease];
[obj setValuesForKeysWithDictionary:parsedResponse];
NSLog(@"bar name %@", obj.bar.name);
Run Code Online (Sandbox Code Playgroud)
这会在NSLog语句中引发异常:
-[__NSCFDictionary name]: unrecognized selector sent to instance 0x692ed70'
Run Code Online (Sandbox Code Playgroud)
但是,如果我将代码更改为它的工作原理:
NSLog(@"bar name %@", [obj.bar valueForKey:@"name"]);
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么我不能做第一个例子,或者我做错了什么?
所以,我已经阅读了有关注释的文档
Objective-C 2.0的点语法和键值编码是正交技术.无论是否使用点语法,都可以使用键值编码,无论是否使用KVC,都可以使用点语法.但是,两者都使用"点语法".在键值编码的情况下,语法用于分隔键路径中的元素.重要的是要记住,当您使用点语法访问属性时,您将调用接收器的标准访问器方法.
然后它提供了一个例子,据说显示了两者之间的差异.但是,我仍然没有得到,KVC和属性访问器方法有什么区别?他们不一样吗?我如何区分调用setValue:forKeyPath:和简单访问器的点?
你如何从带有字典的NSArray中获得最大的价值?
假设我有NSArray包含带有"年龄","姓名"等字典的词典.现在我想得到年龄最大的记录.这有可能与一些KVC魔术?或者我是否必须以"手动"的方式进行迭代?
我尝试过类似的东西:
int max = [[numbers valueForKeyPath:@"@max.intValue"] intValue];
Run Code Online (Sandbox Code Playgroud) key-value-coding ×10
objective-c ×8
cocoa-touch ×4
cocoa ×3
iphone ×3
uikit ×2
debugging ×1
enumeration ×1
ios ×1
nsarray ×1
nspredicate ×1