确定哪个动态UIGestureRecognizer调用它的选择器方法

时间:2014-08-14 20:12:15

标签: objective-c uigesturerecognizer

我有一个不确定数量的UIView,只有在运行时才知道。这些视图中的每一个都必须响应该视图特有的单击事件。我正在使用数组来存储与每个视图相关的信息。由于视图的数量会有所不同,因此我无法简单地编写固定数量的手势识别器方法来响应每个点击事件。

我要做的是编写一个单一的选择器方法,该方法足够聪明,可以知道调用了哪个UIView调用了该方法。我尝试将键值与手势识别器相关联,但这只会导致this class is not key value coding compliant错误。我还想使用另一个数组来存储某种标签值。但在所有情况下,我都回到了同样的基本问题:如何将信息传递给我的选择器方法,以便能够区分哪个UIView被点击?

以下是我填充NSMutableArray的方法,其中包含指向各种UIView对象的指针:

for (int i=0; i<[self.sessionsList count]; i++ {
    ...

    UIView *frame = [[UIView alloc] init];

    // set up a gesture recognizer to handle tap events for each view
    UITapGestureRecognizer *singleTap=[[UITapGestureRecognizer alloc]initWithTarget : self
                                                                                 action : @selector(playAudio:)];

    // this next line will crash the program if I leave it in
    [singleTap setValue:session_num forKey:@"session_num"]; // associate the session number with this gesture
    [frame addGestureRecognizer:singleTap];

    [self.buttonsArray addObject:frame];

    ...
}

然后,在我的选择器方法中,我有这个

- (void) playAudio : (UITapGestureRecognizer *)recognizer
{
    NSLog(@"here"); //this will generate output, but not unique to the various views

    // this was my idea for trapping the identifying number of the UIView that was tapped
    NSString *session_num = [recognizer valueForKey:@"session_num"];
    NSLog(@"session_num: %@", session_num);

    // I started to try this, but I don't know how to make it work
    CGPoint location = [recognizer locationInView:[recognizer.view superview]];
    UIView *thisView = [obj hitTest:location withEvent:event];

}

我非常坚持这一点。有谁看到我做错了什么或有什么建议我怎么做?谢谢!

1 个答案:

答案 0 :(得分:0)

UIView没有响应setValue:forKey任意键。要实现您想要的效果,您应该在播放音频方法中检查手势识别器的view属性。这将引用手势识别器附加到的视图。如果需要,可以在[self.buttonsArray indexOfObject:recognizer.view]方法中playAudio:查找数组中按钮的索引。