标签: key-value-coding

你如何在Cocoa/Obj-C中为KVC包装一个BOOL?

我正在使用KVC来迭代几个视图.设置BOOL属性时遇到问题:

[self setValue:YES forKeyPath:[NSString stringWithFormat:@"myView%d.userInteractionEnabled", n]];
Run Code Online (Sandbox Code Playgroud)

我得到:警告:传递'setValue:forKeyPath:'的参数1使得整数指针没有强制转换.

我找不到[NSValue valueWithBool:YES]或类似的东西.

该怎么办?

cocoa cocoa-touch objective-c key-value-coding

10
推荐指数
1
解决办法
5125
查看次数

为什么valueForKey:在UITextField上抛出UITextInputTraits属性的异常?

运行这个:

@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键值编码访问属性呢?

cocoa-touch key-value-coding uikit

10
推荐指数
1
解决办法
1493
查看次数

KVO和NSNotifications的性能速度如何?

我是否应该害怕使用键值观察(KVO)和NSNotifications?我开始在我的应用程序中使用它们,但我有点不熟悉可能触发appwide调用或自动执行某些操作的概念,并且有点害怕这种开销可能带来的性能损失.

我的担忧没有根据吗?我应该像其他方法一样使用它们吗?它们看起来非常方便并且填补了很多空白,所以我想尽可能使用它们.注意:我主要是为iOS设备编程,因此性能始终是我关注的问题.

iphone cocoa key-value-observing key-value-coding nsnotifications

9
推荐指数
1
解决办法
1948
查看次数

观察UITableViewController的编辑属性

为什么我不能观察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

9
推荐指数
1
解决办法
1691
查看次数

关于UIButton状态的键值观察

UIButton有一个州财产,所有账户似乎都符合KVO标准,没有其他文件说明.但是,当我向UIButton的state属性添加一个观察者时,从未调用过观察者回调.怎么会?

iphone objective-c key-value-observing key-value-coding ios

9
推荐指数
1
解决办法
5019
查看次数

Objective C keypath从iTunes中获取所有艺术家

我正在使用键值编码来获取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,但这很慢.

具体代码并不重要,我只需要键值编码部分.

谢谢!

enumeration objective-c key-value-coding nspredicate

9
推荐指数
1
解决办法
667
查看次数

NSDictionary setValue:

好吧,这让我疯了 - 请告诉我,我不会失去理智!

我宣布:

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

8
推荐指数
2
解决办法
3万
查看次数

将setValuesForKeysWithDictionary与子对象和JSON一起使用

我有一个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 key-value-coding

8
推荐指数
2
解决办法
7509
查看次数

KVC和Properties有什么区别?

所以,我已经阅读了有关注释的文档

Objective-C 2.0的点语法和键值编码是正交技术.无论是否使用点语法,都可以使用键值编码,无论是否使用KVC,都可以使用点语法.但是,两者都使用"点语法".在键值编码的情况下,语法用于分隔键路径中的元素.重要的是要记住,当您使用点语法访问属性时,您将调用接收器的标准访问器方法.

然后它提供了一个例子,据说显示了两者之间的差异.但是,我仍然没有得到,KVC和属性访问器方法有什么区别?他们不一样吗?我如何区分调用setValue:forKeyPath:和简单访问器的点?

cocoa objective-c key-value-coding

8
推荐指数
1
解决办法
2586
查看次数

如何从包含字典的NSArray中获取最大值?

你如何从带有字典的NSArray中获得最大的价值?

假设我有NSArray包含带有"年龄","姓名"等字典的词典.现在我想得到年龄最大的记录.这有可能与一些KVC魔术?或者我是否必须以"手动"的方式进行迭代?

我尝试过类似的东西:

int max = [[numbers valueForKeyPath:@"@max.intValue"] intValue];
Run Code Online (Sandbox Code Playgroud)

iphone cocoa-touch objective-c key-value-coding nsarray

8
推荐指数
1
解决办法
5701
查看次数