などの変数がいくつかありますvh1
vh2
vh3
。for ループで i 変数を使用してカウントすることは可能ですか?
私は次のようなことを意味しますfor(int i = 1; blablabla) { [[vh + i] setBackGroundColor blablabla];}
よろしく
編集: vh1 などは UILabels です!!!
などの変数がいくつかありますvh1
vh2
vh3
。for ループで i 変数を使用してカウントすることは可能ですか?
私は次のようなことを意味しますfor(int i = 1; blablabla) { [[vh + i] setBackGroundColor blablabla];}
よろしく
編集: vh1 などは UILabels です!!!
これはintrospectionによって可能ですが、そのような変数がある場合は、それらを NSArray に入れて、インデックスを使用してアクセスすることをお勧めします。
他の回答者が指摘したように、新しい配列構文を使用すると、すべてのオブジェクトを含む配列を非常に簡単に作成できますが、後で元の ivar の値を変更しても、古い値が保持されます。それはあなたが求めているものかもしれませんし、そうでないかもしれません。
変数を (配列ではなく) 単一のオブジェクトとして保持することに必死になっている場合は、キー値コーディングを使用してプログラムで変数にアクセスできます。キー値コーディングは、KVC とも呼ばれます。
それを行うメソッドは、オブジェクトと他のオブジェクトのvalueForKey:
両方で使用できます。self
MyClass *obj = ... // A reference to the object whose variables you want to access
for (int i = 1; i <= 3; i++) {
NSString *varName = [NSString stringWithFormat: @"var%d", i];
// Instead of id, use the real type of your variables
id value = [obj valueForKey: varName];
// Do what you need with your value
}
docsに KVC の詳細があります。
完全を期すために、この直接アクセスが機能する理由は、標準の KVC 準拠オブジェクトが というクラス メソッドを継承するためaccessInstanceVariablesDirectly
です。この直接アクセスをサポートしたくない場合は、オーバーライドaccessInstanceVariablesDirectly
して を返す必要がありますNO
。
UILabels
XIB からロードする場合は、 を使用できますIBOutletCollection
。
プロパティを宣言します。
@property (nonatomic, strong) IBOutletCollection(UILabel) NSArray *labels;
XIBの複数のラベルをこのプロパティにリンクできるようになりました。次に-viewDidLoad
(XIBをロードした後)、配列にデータが入力され、 simple を使用するだけですfor-in
:
for (UILabel *label in self.labels) {
label.backgroundColor = ...
}
次のコードで各値にアクセスできます。
UILabel *label1;
UILabel *label2;
UILabel *label3;
NSArray *array = @[label1, label2, label3];
for (int i = 0; i<3; i++) {
[array objectAtIndex:i];
}
NSArray に値を追加して初期化できます。後で値を追加する場合は、NSMutableArray を使用できます。
コードを変更しました。
UILabel *label1 = [[UILabel alloc] init];
UILabel *label2 = [[UILabel alloc] init];
UILabel *label3 = [[UILabel alloc] init];
NSArray *array = @[label1, label2, label3];
for (int i = 0; i<3; i++) {
UILabel *label = [array objectAtIndex:i];
label.frame = CGRectMake(0, i*100, 150, 80);
label.text = [NSString stringWithFormat:@"label%d", i];
[self.view addSubview:label];
}