1

データベースからダウンロードした画像をマトリックスとして表示するこの UITableView があります。各テーブル行に4つの画像があります。

ビューから画像を選択できるようにするために、UITapGestureRecognizer を使用しています。各選択を一意にするために、各タップ認識エンジンと各 imageView にタグを付けようとしました。そこで問題なのが…

imageViews とレコグナイザーを作成してタグ付けしている for ループ内にログを配置しました。出力で、それらがすべての値を通過することがわかります。ただし、後で画像を押してタグを取得しようとすると、常に「3」(テーブル行の最後の数字) が表示されます。これにより、各ループで新しいオブジェクトを作成しているにもかかわらず、タグが互いに単純に上書きされていると思われます。それか、私の読み方が間違っているかのどちらかです。

関係のない部分を切り取ります。

for (NSInteger i = 0; i < 4; i++){

asyncImage = [[AsyncImageView alloc]
                               initWithFrame:frame];

[asyncImage loadImageFromURL:url];
    asyncImage.tag = i; 
    NSLog(@"TAG %d", asyncImage.tag);
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap)];
    tapRecognizer.view.tag = i;
    NSLog(@"TapTAG %d", asyncImage.tag);

    [asyncImage addGestureRecognizer:tapRecognizer];
}

そして方法:

- (void)handleTap{
NSLog(@"TAP %d", self.tapRecognizer.view.tag);

}

私のやり方がまったく間違っていると思われる場合は、正しい方向への軽いプッシュをいつでも歓迎します!

前もってありがとう、トム

4

2 に答える 2

2

次の行は、ジェスチャレコグナイザがビューに追加されるまで効果がありません。

tapRecognizer.view.tag = i;

これは、tapRecognizer'sviewが最初はであるためnilです。forこの問題を修正するには、ループの最後の行に割り当てを行います。

また、あなたNSLogは常にあなたが追加した最後の認識機能のタグを表示しています

self.tapRecognizer.view.tag // Instance variable

イベントを引き起こしたものではありません。次のように変更handleTapします。

- (void)handleTap:(UITapGestureRecognizer*) tapRecognizer{
    NSLog(@"TAP %d", tapRecognizer.view.tag);
}

tapRecognizerまた、ビューにレコグナイザーを追加するメソッドでインスタンス変数をローカル変数に置き換え、:セレクター名にコロンを追加する必要があります。

action:@selector(handleTap:)
//              HERE: ----^
于 2012-09-02T14:19:01.733 に答える
0

ループで間違っていると思います。
ループは 4 回実行され、ループを実行するたびに AsyncImageView を asyncImage 変数 (ローカルまたはインスタンス?) に格納します。したがって、ループを初めて実行するときは、オブジェクトを作成して asyncImage の場所に保存し、2 回目はこれを上書きし、3 回目は....

4 つの ImageView を初期化しましたが、最後の 1 つだけを参照しています。そして最後のものは正しい GestureRecognizer を保持しています。

ImageView をビューに追加するのはいつですか?

インスタンス変数を使用して直接上書きすると、画面に追加した他のすべての ImageView が のポインタを指しますasyncImage。そして、ループを 4 回実行して asyncImage データを交換した後、ポインターはループ内の最後の画像を指します。

ここで何が問題なのかを理解してください。

于 2012-09-02T15:16:16.083 に答える