2012-03-31 98 views
15

在我的應用程序中,我在運行時動態地將圖像添加到我的視圖中。我可以同時在屏幕上顯示多個圖像。每個圖像都從一個對象加載。我在圖像中添加了tapGestureRecongnizer,以便在點擊它時調用適當的方法。iOS - UITapGestureRecognizer - 帶參數的選擇器

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)]; 
    [plantImageView addGestureRecognizer:tapGesture]; 

我的問題是,我不知道我點擊了什麼圖像。我知道我可以打電話tapGestureRecognizer.location獲取屏幕上的位置,但那對我來說並不是那麼好。理想情況下,我希望能夠將加載圖像的對象從點擊手勢中傳遞過來。但是,似乎我只能傳入選擇器名稱「imageTapped:」而不是它的參數。

- (IBAction)imageTapped:(Plant *)plant 
{ 
    [self performSegueWithIdentifier:@"viewPlantDetail" sender:plant]; 
} 

有誰知道我可以通過我的對象作爲參數傳遞到tapGestureRecongnizer或其他任何方法可以讓我得到它的手柄的方法嗎?

感謝

布賴恩

回答

26

你幾乎沒有。 UIGestureRecognizer有一個視圖屬性。如果分配和附加手勢識別每個圖像視圖 - 只是因爲它出現你的代碼片段做 - 那麼你的動作代碼(目標)可以是這樣的:

- (void) imageTapped:(UITapGestureRecognizer *)gr { 

    UIImageView *theTappedImageView = (UIImageView *)gr.view; 
} 

什麼是從不太清楚您提供的代碼是你如何與它的相應的ImageView您的工廠模型對象關聯,但它可能是這樣的:

NSArray *myPlants; 

for (i=0; i<myPlants.count; i++) { 
    Plant *myPlant = [myPlants objectAtIndex:i]; 
    UIImage *image = [UIImage imageNamed:myPlant.imageName]; // or however you get an image from a plant 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; // set frame, etc. 

    // important bit here... 
    imageView.tag = i + 32; 

    [self.view addSubview:imageView]; 
} 

現在GR代碼可以做到這一點:

- (void) imageTapped:(UITapGestureRecognizer *)gr { 

    UIImageView *theTappedImageView = (UIImageView *)gr.view; 
    NSInteger tag = theTappedImageView.tag; 
    Plant *myPlant = [myPlants objectAtIndex:tag-32]; 
} 
+0

那是輝煌的。太感謝了。它非常完美!好的解決方案 – 2012-04-01 00:07:44