标签: key-value-coding

objectForKey和valueForKey之间的区别?

objectForKey和之间有什么区别valueForKey?我在文档中查看了它们,它们对我来说似乎是一样的.

cocoa objective-c key-value-coding

343
推荐指数
4
解决办法
11万
查看次数

观察NSMutableArray以进行插入/删除

类具有NSMutableArray类型的属性(和实例var),具有合成访问器(via @property).如果使用以下方法观察此数组:

[myObj addObserver:self forKeyPath:@"theArray" options:0 context:NULL];
Run Code Online (Sandbox Code Playgroud)

然后在数组中插入一个对象,如下所示:

[myObj.theArray addObject:NSString.string];
Run Code Online (Sandbox Code Playgroud)

发送observeValueForKeyPath ...通知.但是,以下内容确实发送了正确的通知:

[[myObj mutableArrayValueForKey:@"theArray"] addObject:NSString.string];
Run Code Online (Sandbox Code Playgroud)

这是因为mutableArrayValueForKey返回一个负责通知观察者的代理对象.

但是,合成访问器不应该自动返回这样的代理对象吗?解决这个问题的正确方法是什么 - 我应该编写一个只调用的自定义访问器[super mutableArrayValueForKey...]吗?

cocoa key-value-observing key-value-coding

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

如何使用键值编码判断对象是否存在密钥?

我想测试一个对象在iPhone SDK中是否有可写的@property.

一种可行的方法是检查-valueForKey:方法,但这似乎相当不优雅!

例:

  @try {
    id *value = [instance valueForKey:@"myProperty"];
  }
  @catch (NSException * e) {
    // Key did not exist
  }
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

iphone properties objective-c key-value-coding

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

NSDecimal,NSDecimalNumber,CFNumber之间的正确选择是什么?

我已经阅读了很多关于NSDecimal,NSNumber,NSNumberDecimal,CFNumber ......它开始对我来说是一种丛林.

基本上,我正在尝试创建一个简单的模型类来处理简单的计算,如下所示:

#import <Foundation/Foundation.h>


@interface Test : NSObject
{
    float rate;
    float amount;
    int duration;
}

- (float)capitalizedAmount;

@end

@implementation Test

- (float)capitalizedAmount {
    return (amount*pow((1.0+rate),duration));
}

@end
Run Code Online (Sandbox Code Playgroud)

我想以名字作为字符串来访问这些方法和setter,因为我打算有很多其他类这样的类,我只保留一个字段列表来进行键值编码.

// This is just the desired behavior
// This evidently won't work with the previous class definition
Test *obj = [[Test alloc] init];
[NSNumber numberWithInt:10]
...
float r;
r = [obj performSelector:NSSelectorFromString(@"capitalizedAmount")];
Run Code Online (Sandbox Code Playgroud)

我知道这是不可能的,performSelector:它将返回一个对象,因此它capitalizedAmount应该返回一个对象.我已经阅读NSInvocation了关于comp.lang的Objective-C Faq的相关内容和相关部分.

我也明白我应该使用NSDecimalNumber,但我想知道两件事:

  1. 内存开销和性能损失是否可以接受更复杂的类(仅在UITableView中显示此类财务计算)?我在C中没有太多背景......
  2. 使用像这样的功能不是太过于挑剔和复杂decimalNumberByAdding:吗?使用Python,很容易定义__add__使用运算符和对象.我应该从中获取浮点值NSDecimalNumber …

iphone cocoa objective-c key-value-coding

28
推荐指数
2
解决办法
1万
查看次数

从Swift 4获取字符串新的密钥路径语法?

如何从Swift 4智能密钥路径语法中获取字符串值(例如)?在这一点上,我对任何方式都很好奇,如果它很复杂并不重要.\Foo.bar

我喜欢类型信息与智能密钥路径相关联的想法.但并非所有的API和第三方都在那里.

通过编译时验证获取属性名称字符串的旧方法#keyPath().使用Swift 4 #keyPath()你必须声明一个属性@objc,这是我宁愿避免的.

reflection key-value-coding ios swift swift4

28
推荐指数
4
解决办法
1万
查看次数

使用属性的名称动态访问Objective-C属性

我知道对象属性的字符串名称.我将如何使用字符串获取和设置该属性?

reflection objective-c key-value-coding declared-property

25
推荐指数
1
解决办法
7379
查看次数

在Int上使用setValue(value,forKey:key)?类型触发非键值编码兼容方法

setValue(value, forKey: key)在我的NSKeyValueCoding兼容的Swift NSObject子类中成功使用了该方法.

这在String选项上非常有效,例如

var name:String?
Run Code Online (Sandbox Code Playgroud)

但是,在Int选项上,它会失败,触发我为了调试目的而重写的未定义键方法:

override func setValue(value: AnyObject!, forUndefinedKey key: String!) {
    println("\(self) this class is not key value coding-compliant for the key \(key)")
}
Run Code Online (Sandbox Code Playgroud)

因此,例如,myId具有良好整数值的键将触发上面的未定义键方法.

var myId:Int?
Run Code Online (Sandbox Code Playgroud)

如果我将上面的定义更改为非可选,那么一切正常:

var myId:Int = 0
Run Code Online (Sandbox Code Playgroud)

随着myId作为一个可选的,我已经试过绝对一切,我可以在铸造,展开,初始化等方式想到的.它只是没有将类视为符合这些数值的键值.

我知道这是一个很好的数值.将var声明更改为String?崩溃.它在lldb看起来也很好:

Printing description of key:
myId
key NSObject    0x00007fb8d530ca20  0x00007fb8d530ca20
k   NSString    "myId"  0x00007fa2aa942f20
value   __NSCFNumber *  Int64(4348129)  0xb000000004258e13
Printing description of value:
4348129
(lldb) 
Run Code Online (Sandbox Code Playgroud)

所以,问题是,有没有人在Swift中使用过 - setValue(value, forKey: key) Int类型的NSKeyValueCoding方法成功了吗?

key-value-coding nsnumber swift nskeyvaluecoding

25
推荐指数
1
解决办法
5946
查看次数

直接访问Objective-C中的嵌套字典值

有没有办法在Objective-C中直接访问外部数组的内部数组?例如,对外部数据源的调用将返回以下对象:

{
bio = "this is the profile.bio data";
"first_name" = John;
"last_name" = Doe;
location =     {
    name = "Any Town, Any State";
};
metadata =    {
    pictures =    {
        picture = "https://picture.mysite.com/picture.jpeg";
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我希望能够访问例如location.name或metadata.pictures.picture数据.但是,点符号似乎不起作用.例如:

_gfbLocation = [result objectForKey:@"location.name"];
_gfbPicture = [result objectForKey:@"metadata.pictures.picture"];
Run Code Online (Sandbox Code Playgroud)

我能够访问此数据的唯一方法是首先将内部数组的内容设置为对象.思考?

iphone dictionary objective-c nsdictionary key-value-coding

24
推荐指数
1
解决办法
2万
查看次数

如何从NSArray中的每个NSDictionary获取特定键的所有值?

我有一个包含字典对象的数组.在每个字典中,密钥是常见的.现在我想获得该密钥的所有值.我有迭代的这些值,但我正在寻找一些直接的方法或一个默认的方法来完成这项工作.

你能帮我一个默认的方法来达到目的吗?谢谢.

数据结构是这样的:

<array>
    <dict>
        <key>Match</key>
        <string>Football</string>
        <key>Stadium</key>
        <string>XXXXX</string>
    </dict>
    <dict>
        <key>Match</key>
        <string>HOCKY</string>
        <key>Stadium</key>
        <string>XXXXX</string>
    </dict>
 </array>
Run Code Online (Sandbox Code Playgroud)

我现在这样做:

NSMutableArray * matches = [[NSMutableArray alloc] init];
        for (int i = 0; i< myArray.count; i++){
            [matches insertObject:[[myArray objectAtIndex:i] objectForKey:@"Match"] atIndex:i];
        }
        [matchDataArray addObjectsFromArray:matches];
Run Code Online (Sandbox Code Playgroud)

它给了我正确的答案.但我不想做这个迭代.我想要一个方法,它将从数组的所有索引返回"匹配"键的所有值,并立即保存在另一个数组中.新创建的数组将只包含来自数组的所有索引的Match键值.

这可能吗??

objective-c nsdictionary key-value-coding nsarray

24
推荐指数
1
解决办法
3万
查看次数

NSValue如何发挥其魔力?

我有一个MVC应用程序.该模型具有一个结构属性NSSize.这是可写的:

- (void)setSize:(NSSize)aSize;
Run Code Online (Sandbox Code Playgroud)

视图NSSize使用键值编码设置它.但是,你不能对结构进行键值编码,所以我把它包装在一个NSValue像这样的对象中:

[theView setValue:[NSValue valueWithSize:mySize]
           forKey:@"theModel.size"];
Run Code Online (Sandbox Code Playgroud)

据我所知,这应该不起作用,因为访问器需要一个结构而不是一个结构NSValue.但它完美无缺.奇妙的.

这怎么可能?

struct objective-c key-value-coding

20
推荐指数
1
解决办法
2245
查看次数