2013-07-14 165 views
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. 
+0

您是否擁有一組固定屬性(例如隱藏,背景,alpha)還是希望它在運行時查找* all *屬性? –

+0

你可以看看這個問題http://stackoverflow.com/questions/2299841/objective-c-introspection-reflection。 – null

+0

您可以非常容易地使用鍵值編碼在循環中複製屬性,但需要複製屬性的名稱列表。 –

回答

4

如果你正在使用一組特定屬性的工作,你可以建立自己的名字的數組,然後使用鍵 - 值編碼來設定它們:

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

這太棒了!謝謝 :) –

3

有關屬性,您可以使用鍵 - 值編碼的固定列表

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

可以副本使用的Objective-C運行時函數class_copyPropertyList()所有屬性,以確定屬性在運行時動態。 但我看到兩個問題是:

  • 複印「內部」的屬性可能會導致不必要的副作用。
  • 您還必須複製在超類中定義的屬性。例如, alpha不是UIImageView的財產,而是UIView的財產。
相關問題