0

假设我有一个对象,也许是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.
4

2 回答 2

4

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

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

如果您希望它复制任何对象的所有属性,您可以使用. 但是,这有很多警告:class_copyPropertyList()objc/runtime.h

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

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

于 2013-07-14T14:49:15.960 回答
3

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

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

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

  • 复制“内部”属性可能会导致不必要的副作用。
  • 您还必须复制超类中定义的属性。例如, alpha不是 的属性,UIImageView而是 的属性UIView
于 2013-07-14T14:48:29.737 回答