2013-10-18 77 views
0

我有一個UITableView,它有一些自定義單元格。在自定義單元格內,我有一個主要的UIImageView。當單元格被創建時,我將一個Tap Gesture識別器添加到圖像視圖中。如何從單元格中另一項的手勢獲取單元格引用

當圖像被點擊我運行以下:

- (void) handleImageTap:(UIGestureRecognizer *)gestureRecognizer { 
    NSLog(@"Image tapped"); 
    UIImageView *imageView = (UIImageView *)gestureRecognizer.view; 
    // send the image instead of self when firing the segue 
    [self performSegueWithIdentifier:@"remindMeTurnInfo" sender:imageView]; 
} 

我然後將圖像傳送到一個新的視圖控制器在prepareForSegue方法:

if ([segue.identifier isEqualToString:@"remindMeTurnInfo"]) { 
     UIImageView *imgView = (UIImageView *)sender; 
     MESPlayedTurnReminderViewController *VC = segue.destinationViewController; 
     VC.turnImage = imgView.image; 
    } 

問題
1.我需要對UIImageView所在單元格的引用,該單元格被點擊。因此,用戶點擊其中一個單元格圖像,我需要知道從哪個單元格(indexPath)中挖掘了該圖像。

2.我發現有時候當圖像被點擊時,didSelectRowAtIndexPath被調用。這是不正確的,它不應該被調用,只有手勢記錄相關的handleTap方法。應該被調用。我如何確保didSelectRowAtIndexPath未被調用,因爲在單元格被實際(正確)選擇時需要運行其他代碼。

回答

2

有兩個方面,這通常是這樣做的。在cellForRowAtIndexPath中爲圖像視圖添加一個標籤,該標籤等於indexPath.row,或者從圖像視圖中查找視圖層次結構,直到找到一個UITableViewCell(或子類)。這是可以做到這樣的:

- (void) handleImageTap:(UIGestureRecognizer *)gestureRecognizer { 
    UIImageView *imageView = (UIImageView *)gestureRecognizer.view; 
    UIView *superview = imageView.superview; 
    while (![superview isKindOfClass:[UITableViewCell class]]) { 
     superview = superview.superview; 
    } 
    NSLog(@"indexPath.row is: %d", [self.tableView indexPathForCell:(UITableViewCell *)superview].row); 
} 

搜索,而不是使用像imageView.superview.superview(這將在iOS 6中工作)的原因,是該層次結構可以在不同的版本的iOS的變化,事實上,它確實在iOS 6和iOS 7之間發生了變化。

至於第二個問題,可能是因爲您不小心敲擊了單元格而不是圖像視圖。除了使圖像視圖更大以便點擊更容易,我沒有看到解決方法。

+0

感謝這種方法。這很好,但是我怎麼會把indexPath傳入prepareForSegue方法。目前我傳入imageView作爲方法的發送者,以便我可以鏈接到圖像(每個問題),但是如何在prepareForSegue方法中實際需要此參數時傳遞indexPath。 – StuartM

+0

我能夠在prepareForSegue方法中複製上述內容,沒有任何問題,這很好。謝謝你的幫助。 – StuartM

0

1 .-爲了讓細胞可以檢查的UIImageView的上海華拍了拍

- (void) handleImageTap:(UIGestureRecognizer *)gestureRecognizer 
{  
    UIImageView *imageView = (UIImageView *)gestureRecognizer.view; 
    UITableViewCell *cell = (UITableViewCell *)imageView.superview; 
} 

2:要禁用一個UITableView小區選擇

[self.yourTableView setAllowsSelection:NO]; 
相關問題