设置一个对象的属性,以匹配另一个
可以说我有一个目标,也许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.
如果你正在使用一组特定属性的工作,你可以建立自己的名字的数组,然后使用键 - 值编码来设定它们:
for(NSString * key in @[@"hidden", @"frame", @"backgroundColor"]) {
[toObject setValue:[fromObject valueForKey:key] forKey:key];
}
如果你想要这个复制全部任何属性的属性,您可以使用objc/runtime.h
中的class_copyPropertyList()
函数获取一个类的声明属性列表。这有很多警告,但:
- 此调用将返回您不应该触摸的私有属性。举个例子,手势识别器只能在iOS 3.2中正式使用,但是它们是一个私人类,至少早在3.1,也可能在3.0。
- 它将返回只读属性,即使设置它们可能是危险的(KVC可以设置实例变量,但不一定知道如何正确地使用),甚至不可能。
- 它不会包括任何不属于一个属性。例如,UIControls的目标和动作不会被(公共)属性暴露。
- 它不一定知道如何处理某些不能在两个对象之间共享的属性,如布局约束。
- 很多非常常见的数据类型(例如NSString,NSArray和NSDictionary)都没有真正将它们的数据存储在属性中,因此这将完全错过这些类的重点。
换句话说,它很可能以可怕的方式突破。除非你真的知道你在做什么,否则不要这样做。
你的“警告列表”更好! –
这太棒了!谢谢 :) –
有关属性,您可以使用键 - 值编码的固定列表:
NSArray *propList = @[@"alpha", @"hidden"];
NSDictionary *dict = [imageView1 dictionaryWithValuesForKeys:propList];
[imageView2 setValuesForKeysWithDictionary:dict];
您可以副本使用的Objective-C运行时函数class_copyPropertyList()
所有属性,以确定属性在运行时动态。 但我看到两个问题是:
- 复印“内部”的属性可能会导致不必要的副作用。
- 您还必须复制在超类中定义的属性。例如,
alpha
不是UIImageView
的财产,而是UIView
的财产。
您是否拥有一组固定属性(例如隐藏,背景,alpha)还是希望它在运行时查找* all *属性? –
你可以看看这个问题http://*.com/questions/2299841/objective-c-introspection-reflection。 – null
您可以非常容易地使用键值编码在循环中复制属性,但需要复制属性的名称列表。 –