2012-09-02 76 views
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); 

} 

如果你覺得我做的這一切完全錯誤的,在正確的方向輕推是隨時歡迎!

由於提前,湯姆

回答

2

下面的行沒有影響,直到手勢識別已經被添加到視圖:

tapRecognizer.view.tag = i; 

這是因爲tapRecognizerview最初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: ----^ 
+0

這不就是這行嗎? [asyncImage addGestureRecognizer:tapRecognizer]; asyncImage是一個UIImageView。 – Tom

+0

@ user1534948是的,但是它太晚了:tapRecognizer.view.tag = i'的調用必須在後面,而不是在視圖設置之前。目前,在調用時'tapRecognizer.view'爲'nil',所以'setTag'消息被設置爲'nil',因此被忽略。 – dasblinkenlight

+0

我剛試過。這是有道理的,你說的,但他們仍然都在返回3 ...我有一種感覺,問題可能是我如何返回變量。 handleTap方法返回實際的水龍頭,而不是最後創建的水龍頭? – Tom

0

我想你在循環中做錯了。
循環運行4次,並且每次運行循環時,都會將AsyncImageView存儲到asyncImage變量(本地或實例?)中。因此,您第一次運行循環時,您創建一個對象並將其存儲在asyncImage位置,第二次被覆蓋,第三次...

您已經初始化4個ImageViews,但只引用最後一個。最後一個擁有你想要的正確的GestureRecognizer。

何時將ImageView添加到視圖中?

如果您使用可變實體並直接覆蓋它,您添加到屏幕上的所有其他ImageView指向asyncImage的指針。指針 - 運行4次循環並交換異步圖像數據後 - 指向循環中的最後一幅圖像。

希望你明白,問題在這裏。