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 位置,第二次被覆盖,第三次......

您已经初始化了 4 个 ImageView,但您只引用了最后一个。最后一个拥有正确的 GestureRecognizer,你想要。

什么时候将 ImageView 添加到视图中?

如果您使用实例变量并直接覆盖它,则您添加到屏幕的所有其他 ImageView 都指向asyncImage. 并且指针 - 在循环运行 4 次并交换 asyncImage 数据后 - 指向循环中的最后一个图像。

希望你明白,这里有什么问题。

于 2012-09-02T15:16:16.083 回答