为自定义UIView内部循环设置UITapGestureRecognizer

时间:2012-10-03 06:15:37

标签: iphone objective-c uiview uitapgesturerecognizer

我有一个包含嵌套UIView的视图控制器。我想为我正在添加的每个子视图添加一个tap监听器。但是当我点击子视图时,我发现SIGABRT错误。

这是我的代码:

- (void) viewDidLoad {
    [super viewDidLoad];

    //set container
    UIView *container = [[UIView alloc] initWithFrame:CGRectMake(5, 5, 320, 420)];
    container.backgroundColor = [UIColor blueColor];

    //create new subview within container. I call it "card"
    for (int i=0; i<5; i++)
    {
        //create card
        UIView *card = [[UIView alloc] initWithFrame:CGRectMake(10, 35 + (65 * i), 300, 45)];
        card.backgroundColor = [UIColor greenColor];

        //set tap event with action selector = cardRowTapped
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cardRowTapped)];
        [card addGestureRecognizer:tap];

        //add subview
        [container addSubview:card];
    }

    //add subview to self
    [self.view addSubview:container];

}

这是我的点按处理程序代码

- (void) cardRowTapped:(UITapGestureRecognizer *)gr {
    NSLog( @"hello");
}

控制台输出:

  

2012-10-03 13:23:37.173 MyProject [5167:707] - [MyViewController   cardRowTapped]:无法识别的选择器发送到实例0x2cd810

     

2012-10-03 13:23:37.179 MyProject [5167:707] * 终止应用程序   未捕获的异常'NSInvalidArgumentException',原因:   ' - [MyViewController cardRowTapped]:发送到无法识别的选择器   实例0x2cd810'

     

* 第一次抛出调用堆栈:(0x314b888f 0x377f6259 0x314bba9b 0x314ba915 0x31415650 0x30c45637 0x30bd5d65 0x30e06479 0x30b51f55   0x30b50aa3 0x30b5d7e9 0x30b5d627 0x30b5d1f5 0x30b43695 0x30b42f3b   0x3348922b 0x3148c523 0x3148c4c5 0x3148b313 0x3140e4a5 0x3140e36d   0x33488439 0x30b71cd5 0x76e8d 0x76e28)终止调用throw   异常(LLDB)

知道为什么会这样吗?

3 个答案:

答案 0 :(得分:0)

你的方法需要一个由手势传递的成员变量,所以改变如下的点击手势方法,

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cardRowTapped:)];

并检查它是否应该工作,如果你不使用ARC,还有一件事,然后在使用后释放它们。

答案 1 :(得分:0)

在添加手势时尝试此代码,让代理人像下面那样..

UIView *card = [[UIView alloc] initWithFrame:CGRectMake(10, 35 + (65 * i), 300, 45)];
        card.backgroundColor = [UIColor greenColor];

        //set tap event with action selector = cardRowTapped
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cardRowTapped:)];
        [tap setNumberOfTapsRequired:1];
        [tap setDelegate:self];
        [card addGestureRecognizer:tap];
        [tap release];
        //add subview
        [container addSubview:card];

将代理人放在.h文件中,如下所示..

@interface ViewController : UIViewController<
UIGestureRecognizerDelegate>{
//.....
}

我希望这可以帮助你...

:)

答案 2 :(得分:0)

只需更改此代码:

//set tap event with action selector = cardRowTapped
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cardRowTapped:)];
        [card addGestureRecognizer:tap];

唯一的区别是:

@selector(cardRowTapped:)
if you have the method with parameter then ":" should be there.