I have a view controller which contains nested UIView. I would like to add a tap listener for each subview I’m adding. But I caught a SIGABRT error when I tap the subview.
Here is my code:
- (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];
}
and here is my tap handler code
- (void) cardRowTapped:(UITapGestureRecognizer *)gr {
NSLog( @"hello");
}
Console output:
2012-10-03 13:23:37.173 MyProject[5167:707] -[MyViewController
cardRowTapped]: unrecognized selector sent to instance 0x2cd8102012-10-03 13:23:37.179 MyProject[5167:707] * Terminating app due to
uncaught exception ‘NSInvalidArgumentException’, reason:
‘-[MyViewController cardRowTapped]: unrecognized selector sent to
instance 0x2cd810’* First throw call stack: (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) terminate called throwing an
exception(lldb)
Any idea why this is happening?
your method requires a member variable which is passed by the gesture, so change the tap gesture method like below,
and check out it should work, one more thing if you are not using ARC, then release the objects after their usage.