0

私が1つのオブジェクトを持っているとしましょう、おそらく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];
}

これで任意のオブジェクトのすべてのプロパティをコピーする場合は、関数 inを使用して、クラスの宣言されたプロパティのリストを取得できます。ただし、これには多くの注意事項があります。class_copyPropertyList()objc/runtime.h

  1. この呼び出しは、触れてはならないプライベート プロパティを返します。例として、ジェスチャ レコグナイザーは iOS 3.2 でのみ正式に利用可能になりましたが、少なくとも 3.1 まではプライベート クラスであり、おそらく 3.0 でも同様でした。
  2. 読み取り専用のプロパティを返しますが、それらを設定することは危険 (KVC はインスタンス変数を設定できますが、必ずしも正しく設定する方法を知っているとは限りません) または不可能でさえあります。
  3. プロパティにないものは含まれませんたとえば、UIControls のターゲットとアクションは、(パブリック) プロパティによって公開されません。
  4. レイアウトの制約など、2 つのオブジェクト間で共有できない特定のプロパティを処理する方法を必ずしも知っているとは限りません。
  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()しかし、それには2つの問題があります。

  • 「内部」プロパティをコピーすると、望ましくない副作用が発生する可能性があります。
  • スーパークラスで定義されたプロパティもコピーする必要があります。たとえば、 alphaは のプロパティではなく、 のプロパティUIImageViewですUIView
于 2013-07-14T14:48:29.737 に答える