关于forKeyPath

时间:2017-06-23 10:21:45

标签: objective-c key-value-observing kvc

我正在关注this tutorial以了解KVC。 在该教程中说明了以下

[someObject.someProperty setText:@"This is a text"];

 Using KVC:

[self setValue:@"this is a text" 
forKeyPath:@"someObject.someProperty.text"]

我的问题是:

1-当我们使用KVC时,为什么我们在forKeyPath中使用“.text”?

2-does“forKeyPath”应该始终引用我们拥有的对象,或者它可以只是任何文本

1 个答案:

答案 0 :(得分:1)

教程中的代码行:

[someObject.someProperty setText:@"This is a text"];

使用两种不同的方式来访问两个不同的属性,因此它有点令人困惑。

声明一个属性,比如说windowHeight,声明了两个叫做 getter 的方法,它们获取属性值,以及 setter ,它设置了它。在我们的示例propertyNamesetPropertyName中,这些方法分别命名为windowHeightsetWindowHeight。调用这些方法是使用属性的原始方式。以这种方式编写的教程是:

[[someObject someProperty] setText:@"This is a text"];

这会调用someProperty的getter someObject,它会返回另一个对象,比如someOtherObject,然后调用setText的setter someOtherObject

后来在Objective-C的开发中,点符号被引入作为getter和setter的简写。使用此表示法,getter call [someObject someProperty]可以写为someObject.someProperty,而setter call [someObject setSomeProperty:someValue]可以写为赋值语句someObject.someProperty = someValue

在任何上述点表达式中,someObject是一个返回对象引用的表达式。它可能是一个简单的变量引用;或者它可能是一个更复杂的表达式,包括另一个点表达式,它返回一个对象引用。

使用点表示法编写教程:

someObject.someProperty.text = @"This is a text";

与KVC 密钥路径的相似之处现在应该是显而易见的。

您的教程选择在同一声明中混合'''匹配原始和点符号样式,可能会导致您的混淆和问题。

HTH