设置一个对象属性以匹配另一个

时间:2013-07-14 14:12:57

标签: ios objective-c object properties

假设我有一个对象,可能是UIImageView ...

.hidden = NO;

alpha是.alpha = 0.425;

背景颜色为[UIColor blackColor];

无论如何,如果我有另一个UIImageView,我可以设置所有属性以匹配此UIImageView's属性。

imageView2.properties = imageView1.properties;

也许是for-loop?类似的东西:

//for (properties *property in object1) {

或者我必须经历各种可能性。

imageView2.alpha = imageView1.alpha;
imageView2.hidden = imageView1.hidden;
imageView2.backgroundColor = imageView1.backgroundColor;
imageView2.center = imageView1.center
//etc.

2 个答案:

答案 0 :(得分:4)

如果您正在使用一组特定属性,则可以构建其名称数组,然后使用键值编码来设置它们:

for(NSString * key in @[@"hidden", @"frame", @"backgroundColor"]) {
    [toObject setValue:[fromObject valueForKey:key] forKey:key];
}

如果要复制任何对象的所有属性,可以使用class_copyPropertyList()函数获取类的声明属性列表。 {1}}。不过,这有很多警告:

  1. 此调用将返回您不应触及的私有属性。例如,手势识别器仅在iOS 3.2中正式提供,但它们至少可以追溯到3.1版本,也可能在3.0版本中。
  2. 它将返回只读属性,即使设置它们可能是危险的(KVC可以设置实例变量,但不一定知道如何正确)甚至不可能。
  3. 不会包含任何不在属性中的内容。例如,(公共)属性不会公开UIControl的目标和操作。
  4. 它不一定知道如何处理两个对象之间无法共享的某些属性,例如布局约束。
  5. 许多非常常见的数据类型 - 例如NSString,NSArray和NSDictionary--并没有真正将它们的数据存储在属性中,所以这将完全忽略这些类的点。
  6. 换句话说,它很可能以可怕的方式打破。除非你真的知道你在做什么,否则不要这样做。

答案 1 :(得分:3)

对于属性的固定列表,您可以使用键值编码:

NSArray *propList = @[@"alpha", @"hidden"];
NSDictionary *dict = [imageView1 dictionaryWithValuesForKeys:propList];
[imageView2 setValuesForKeysWithDictionary:dict];

可以通过使用Objective-C运行时函数class_copyPropertyList()来复制所有属性,以在运行时动态确定属性。 但我发现有两个问题:

  • 复制“内部”属性可能会导致不必要的副作用。
  • 您还必须复制超类中定义的属性。例如, alpha不是UIImageView的属性,而是UIView的属性。
相关问题