我有这个UITableView显示图像,从数据库下载,作为矩阵:每个表行中有4个图像。
为了能够从我正在使用UITapGestureRecognizer的视图中选择图像。为了使每个选择唯一,我一直在尝试标记每个点击识别器和每个imageView。这就是问题所在......
我在for循环中放了一个日志,它创建并标记了imageViews和识别器,我可以在输出中看到它们传递了所有的值。然而,当我试图通过稍后按下图像来获取标签时,我总是得到“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);
}
如果你认为我这样做完全错了,那么欢迎轻轻推动正确的方向!
先谢谢,汤姆
答案 0 :(得分:2)
在将手势识别器添加到视图中之后,以下行无效:
tapRecognizer.view.tag = i;
这是因为tapRecognizer
的{{1}}最初是view
。在nil
循环的最后一行进行分配以纠正此问题。
此外,for
始终会显示您添加的最后一位识别器的标记
NSLog
不是那个解雇事件的人。按如下方式更改self.tapRecognizer.view.tag // Instance variable
:
handleTap
您还应该在将识别器添加到视图的方法中将- (void)handleTap:(UITapGestureRecognizer*) tapRecognizer{
NSLog(@"TAP %d", tapRecognizer.view.tag);
}
实例变量替换为局部变量,并在选择器名称中添加冒号tapRecognizer
:
:
答案 1 :(得分:0)
我认为你在循环中做错了。
你的循环运行4次,每次运行循环时,都会将AsyncImageView存储到asyncImage变量(本地或实例?)。因此,第一次运行循环时,您创建一个对象并将其存储在asyncImage位置,第二次将其覆盖,第三次....
您已初始化了4个ImageView,但您只是引用了最后一个。最后一个拥有你想要的正确的GestureRecognizer。
何时将ImageView添加到视图中?
如果使用实例varable并直接覆盖它,则添加到屏幕的所有其他ImageView都指向asyncImage
的指针。指针 - 在运行4次循环并交换asyncImage数据后 - 指向循环中的最后一个图像。
希望你明白,这里的问题是什么。