目标-c:设置动态属性

Posted

技术标签:

【中文标题】目标-c:设置动态属性【英文标题】:objective-c: Set dynamic properties [duplicate] 【发布时间】:2013-06-29 21:40:09 【问题描述】:

我有一个函数,它接收一个对象、一个属性的名称及其值。 我可以像这样简单地设置对象的属性吗:

-(void)dynamicSetterWithProperty:(NSString*)propertyThatIsKnownOnlyInRuntime
                        andValue:(NSString*)valueThatIsKnownOnlyInRuntime

       _myObject.propertyNameThatIsKnownOnlyInRuntime = valueNameThatIsKnownOnlyInRuntime;


还是我必须以这种丑陋的方式来做:

-(void)dynamicSetterWithProperty:(NSString*)propertyThatIsKnownOnlyInRuntime
                        andValue:(NSString*)valueThatIsKnownOnlyInRuntime

       if([propertyNameThatIsKnownOnlyInRuntime isEqualToString@"name"])
              _myObject.name = valueNameThatIsKnownOnlyInRuntime;
       

       else if([propertyNameThatIsKnownOnlyInRuntime isEqualToString@"age"])
              _myObject.age = valueNameThatIsKnownOnlyInRuntime;
       


【问题讨论】:

@KurtRevis 这是我为 setValue:forKey [ setValue:forUndefinedKey:] 得到的:这个类与键 1759 的键值编码不兼容。האם אוטובוס 【参考方案1】:

嗯,你可以利用KVC:

[_myObject setValue:runtimeValue forKey:runtimeProperty];

当然,您可以先检查属性是否对 respondsToSelector 有效,或者通过在子类中覆盖 valueForUndefinedKey:setValue:forUndefinedKey: 来捕获任何无效消息。

【讨论】:

从技术上讲,在一般情况下,您不能使用respondsToSelector: 来判断对象是否符合 KVC 的键,因为访问器不需要遵循具有声明属性的集合方案。我认为通常最好还是继续操作,让操作自然失败,除非有强烈的当地理由阻止它。 这是我得到的:[ setValue:forUndefinedKey:]:这个类不符合键 1759 的键值编码。האם אוטובוס 这意味着QuestionDetails 没有1759 属性。 @Chuck True,感谢您指出这一点。

以上是关于目标-c:设置动态属性的主要内容,如果未能解决你的问题,请参考以下文章

如何滚动 UIlabel 文本并在目标 c 中动态设置它的宽度和高度

使用 ANT 动态设置属性

VS2010添加外来库设置

在目标 c 中使用 jsonModel 映射时将默认值设置为空字段

C#winform动态添加控件

在Backbone.js视图中动态设置id和className