• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Objective-C for文でのインスタンス)

Objective-Cの初心者によるインスタンス作成の方法

このQ&Aのポイント
  • Objective-CのNSMutableArrayを使用して複数のラベルを作成する方法を教えてください。
  • 変数iを使用してラベルに連番を付けたいのですが、どのようにすればいいですか?
  • Objective-C初心者ですが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#177743
noname#177743
回答No.2

ああ、なるほど。タッチしたUILabelを取得するのに、ということなのですね。 これは、いくつか方法があると思いますが、tagを利用するのが簡単そうです。最初にforを使ってUILabelを作成するときに、UILabelの「tag」というプロパティにユニークな番号を設定してください(番号はゼロより大きくないとダメ)。そしてuserInteractionEnabledというのをtrueにします。こんな感じです。 for (略) UILabel* label = 略; label.tag = 100 + i; // 適当に label.userInteractionEnabled = true; これで、タッチしたとき、touch.view.tagの値を調べれば、タッチしたUILabelのtagの値が得られます。例えば、UILabelを作成するときに、tagに100, 101, 102……と値を設定していったとします。で、タッチイベントで、touch.view.tagの値が103だったら、インデックス番号3のUILabelだ、とわかるわけです。

s-0726
質問者

お礼

すいません、簡単なミスをしていました。 [tiles objectAtIndex:touch.view.tag]; を [tiles objectAtIndex:touch.view.tag-100]; としたらうまくいきました。 ありがとうございました。

s-0726
質問者

補足

label.tag = 100+i; label.userInteractionEnabled = true; として、 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; if (touch.view.tag!=0) { NSLog(@"%d",touch.view.tag); } } としたところLogにlabelに対応した番号がでるのでタッチしたlabelの取得はできたと思います。 しかし、 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; if (touch.view.tag!=0) { NSLog(@"%d",touch.view.tag);   UILabel *labelA = [tiles objectAtIndex:touch.view.tag]; labelA.text=@"A"; } } とすると Thread 1 :signal SIGABRT のエラーがでます。 objectAtIndex:のあとにはtouch.view.tagが使えないみたいです。 どのような方法をつかえばよいでしょうか? 何回もすいません。

その他の回答 (1)

noname#177743
noname#177743
回答No.1

うーん、ちょっとよくわからないのですが……。なぜ、label0というような名前のローカル変数に格納しないといけないのですか? NSArrayに保存しているなら、インデックス番号で普通にオブジェクトを取得できると思うのですが……。どうしても名前で、ということなら、NSArrayではなく、NSDictionaryを使ってキーに@"label0"など設定すればよいでしょうし。 普通はそれで何ら支障はないはずですので、「こういうことをしたいのでどうしてもこのやり方でないといけない」という理由がもう少し詳しく説明いただけると何か方法が見つかるかも知れません。

s-0726
質問者

補足

回答ありがとうございます。 説明不足で申し訳ありません。 自分がやりたいことは、 同じ画像を並べる→タッチされた画像を他の画像に変換 ということです。 NSMutableArray *tiles = [NSMutableArray array]; for( int i=0; i<25; i++ ){ UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0,0, tileSize,tileSize)]; label.text=[NSString stringWithFormat:@"%d",i]; [tiles addObject:label]; [self.view addSubview:label]; label.userInteractionEnabled = YES; } として、タッチイベントで -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; if ( touch.view == label ){ UILabel *labelA = [tiles objectAtIndex:(タッチされた要素)]; labelA.text=@"A"; } というようにしているのですが、 if ( touch.view == label ) のlabelはfor文の中で最後に生成されたになるので25番目のlabelにしかタッチが反応しません。 また UILabel *labelA = [tiles objectAtIndex:(タッチされた要素)]; もどのようにしてタッチされた要素を取得するのかわかりません。 プログラムをはじめて数日なので考え方が間違っていると思いますがよろしくお願いします。