选择多个图像

时间:2012-09-02 14:05:22

标签: iphone objective-c ios

我有这个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);

}

如果你认为我这样做完全错了,那么欢迎轻轻推动正确的方向!

先谢谢,汤姆

2 个答案:

答案 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数据后 - 指向循环中的最后一个图像。

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