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

问题描述:

可以说我有一个目标,也许UIImageView ...设置一个对象的属性,以匹配另一个

.hidden = NO;

阿尔法是.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. 
+0

您是否拥有一组固定属性(例如隐藏,背景,alpha)还是希望它在运行时查找* all *属性? –

+0

你可以看看这个问题http://*.com/questions/2299841/objective-c-introspection-reflection。 – null

+0

您可以非常容易地使用键值编码在循环中复制属性,但需要复制属性的名称列表。 –

如果你正在使用一组特定属性的工作,你可以建立自己的名字的数组,然后使用键 - 值编码来设定它们:

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

如果你想要这个复制全部任何属性的属性,您可以使用objc/runtime.h中的class_copyPropertyList()函数获取一个类的声明属性列表。这有很多警告,但:

  1. 此调用将返回您不应该触摸的私有属性。举个例子,手势识别器只能在iOS 3.2中正式使用,但是它们是一个私人类,至少早在3.1,也可能在3.0。
  2. 它将返回只读属性,即使设置它们可能是危险的(KVC可以设置实例变量,但不一定知道如何正确地使用),甚至不可能。
  3. 不会包括任何不属于一个属性。例如,UIControls的目标和动作不会被(公共)属性暴露。
  4. 它不一定知道如何处理某些不能在两个对象之间共享的属性,如布局约束。
  5. 很多非常常见的数据类型(例如NSString,NSArray和NSDictionary)都没有真正将它们的数据存储在属性中,因此这将完全错过这些类的重点。

换句话说,它很可能以可怕的方式突破。除非你真的知道你在做什么,否则不要这样做。

+0

你的“警告列表”更好! –

+0

这太棒了!谢谢 :) –

有关属性,您可以使用键 - 值编码的固定列表

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

可以副本使用的Objective-C运行时函数class_copyPropertyList()所有属性,以确定属性在运行时动态。 但我看到两个问题是:

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