views:

57

answers:

2

I have a UITableView with custom cells. Inside each cell is 2 views. Each view has a UIGestureRecognizer attached to handle tap events. When the view is tapped, I send a message to a UINavigationController to push a detail view. This scenario works fine until I actually scroll the table. After the table is scrolled, the app crashes when the user taps on one of the views inside of a cell. For example, I can load the app, click on a view in the 2nd cell, and get the detail view to be pushed onto the screen properly. From there, I navigate back to the table, scroll to the bottom, back to the top, and tap the same view. From there, the app crashes with an unrecognized selector error. Here is my setup for the gesture (in viewDidLoad):

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                                                                          action:@selector(handleTap:)];
[self.view addGestureRecognizer:recognizer];
recognizer.delegate = self;
[recognizer release];

And here is the method that is invoked:

-(void)handleTap:(UITapGestureRecognizer *)sender{
    NSLog(@"Handling tap on ArticleTileViewController");
    ArticleViewController *vc = [[ArticleViewController alloc] initWithArticleData:self.articleDataArray];
    PROJECTAppDelegate *appDelegate = (PROJECTAppDelegate *)[UIApplication sharedApplication].delegate;

    [appDelegate.navController pushViewController:vc animated:YES]; 
}[appDelegate.navController pushViewController:vc animated:YES]; 
    }

Finally, here is the stack trace I get in the console:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType handleTap]: unrecognized selector sent to instance 0x607ba30'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x02839b99 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x0298940e objc_exception_throw + 47
    2   CoreFoundation                      0x0283b6ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x027ab2b6 ___forwarding___ + 966
    4   CoreFoundation                      0x027aae72 _CF_forwarding_prep_0 + 50
    5   UIKit                               0x0057f060 -[UIGestureRecognizer _updateGestureWithEvent:] + 727
    6   UIKit                               0x0057b8bf -[UIGestureRecognizer _delayedUpdateGesture] + 47
    7   UIKit                               0x00580152 _UIGestureRecognizerUpdateObserver + 637
    8   UIKit                               0x00581464 _UIGestureRecognizerUpdateGesturesFromSendEvent + 51
    9   UIKit                               0x0032a844 -[UIWindow _sendGesturesForEvent:] + 1292
    10  UIKit                               0x003263bf -[UIWindow sendEvent:] + 105
    11  UIKit                               0x00309cb4 -[UIApplication sendEvent:] + 447
    12  UIKit                               0x0030e9bf _UIApplicationHandleEvent + 7672
    13  GraphicsServices                    0x02f07822 PurpleEventCallback + 1550
    14  CoreFoundation                      0x0281aff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    15  CoreFoundation                      0x0277b807 __CFRunLoopDoSource1 + 215
    16  CoreFoundation                      0x02778a93 __CFRunLoopRun + 979
    17  CoreFoundation                      0x02778350 CFRunLoopRunSpecific + 208
    18  CoreFoundation                      0x02778271 CFRunLoopRunInMode + 97
    19  GraphicsServices                    0x02f0600c GSEventRunModal + 217
    20  GraphicsServices                    0x02f060d1 GSEventRun + 115
    21  UIKit                               0x00312af2 UIApplicationMain + 1160
    22  PROJECT                                0x00002459 main + 121
    23  PROJECT                                0x000023d5 start + 53
    24  ???                                 0x00000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException

'

EDIT: After testing with this for a while, I've determined that only the views that are visible on the screen at the time will fire the event. Everything else crashes with the above error. Possibly related to this unanswered question?

Here is my header declaration (iVars and properties omitted for clarity:

@interface ArticleTileViewController : UIViewController<UIGestureRecognizerDelegate> {

}

-(void)handleTap:(UITapGestureRecognizer *)sender;
+2  A: 

Basically this problems means that you are sending a message to an object that does not recognize the message at all, ie the method is missing.

Your selector creation is incorrect it should be:

UIGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];

and

- (void) handleTap:(UITapGestureRecognizer *)sender {

--UPDATE--

recognizer.delegate = self;

I apologize for asking, but are you sure that 'self' actually has the method handleTap:?

willcodejavaforfood
Now I get an immediate crash when I tap on the view: -[__NSCFType handleTap:]: unrecognized selector sent to instance 0x62711702010-10-12 09:42:22.505 FLUD[5284:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType handleTap:]: unrecognized selector sent to instance 0x6271170'
Mark Struzinski
updated after your comments :)
willcodejavaforfood
The method is declared in my header file, and I'm declaring the class as a UIGestureRecognizerDelegate in the interface declaration. Am I missing something?
Mark Struzinski
UPDATE: I updated the code to show what I'm doing right now, in addition to the header file
Mark Struzinski
I'm asking if SELF actually has that method? You are setting the delegate to be self.
willcodejavaforfood
Yes, the method exists in the header and is implemented within the same class. Also, this is following Apple's example code. Although, I can't find an example doing what I'm trying to do by using views inside of custom uitablecells.
Mark Struzinski
@Mark - OK sorry just doing some sanity checking
willcodejavaforfood
A: 

I figured out what I was doing wrong. In my initialization code (from another ViewController), I was releasing the ArticleTileViewControllers after I added them to the UITableViewCell. This was causing an object to be messaged that was no longer in memory.

Stupid programmer mistake!!

Mark Struzinski