みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Objective-C for文でのインスタンス

既出の質問と類似してますが、解決しないので質問します。
Objective-CのNSMutableArrayを使いラベルを複数個作りならべたいのですが、
変数iを使ってラベルに番号をつける方法がわかりません。

今のコードは

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];
}

です。
これを

UILabel *label%d,i = [[UILabel alloc]initWithFrame:CGRectMake(0,0, tileSize,tileSize)];
のようにして、
label0、lable1、label2、label3・・・・
というように生成するにはどうしたらいいですか?

Objective-C初心者です。
よろしくお願いします。

投稿日時 - 2013-02-27 20:45:33

QNo.7967768

すぐに回答ほしいです

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

ああ、なるほど。タッチした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だ、とわかるわけです。

投稿日時 - 2013-02-28 17:53:51

補足

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が使えないみたいです。
どのような方法をつかえばよいでしょうか?
何回もすいません。

投稿日時 - 2013-02-28 19:07:08

お礼

すいません、簡単なミスをしていました。

[tiles objectAtIndex:touch.view.tag];


[tiles objectAtIndex:touch.view.tag-100];

としたらうまくいきました。
ありがとうございました。

投稿日時 - 2013-02-28 19:25:58

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

うーん、ちょっとよくわからないのですが……。なぜ、label0というような名前のローカル変数に格納しないといけないのですか? NSArrayに保存しているなら、インデックス番号で普通にオブジェクトを取得できると思うのですが……。どうしても名前で、ということなら、NSArrayではなく、NSDictionaryを使ってキーに@"label0"など設定すればよいでしょうし。

普通はそれで何ら支障はないはずですので、「こういうことをしたいのでどうしてもこのやり方でないといけない」という理由がもう少し詳しく説明いただけると何か方法が見つかるかも知れません。

投稿日時 - 2013-02-28 10:03:34

補足

回答ありがとうございます。
説明不足で申し訳ありません。
自分がやりたいことは、

同じ画像を並べる→タッチされた画像を他の画像に変換

ということです。

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:(タッチされた要素)];

もどのようにしてタッチされた要素を取得するのかわかりません。

プログラムをはじめて数日なので考え方が間違っていると思いますがよろしくお願いします。

投稿日時 - 2013-02-28 12:12:07

あなたにオススメの質問