UITableView中的UIGestureRecognizer - 滚动后崩溃?

问题描述:

我有一个UITableView自定义单元格。每个单元格内有2个视图。每个视图都有一个UIGestureRecognizer,用于处理点击事件。当点击视图时,我会向UINavigationController发送消息以推送详细视图。这种情况下工作正常,直到我实际上滚动表。表格滚动后,当用户点击单元格内的其中一个视图时,应用程序崩溃。例如,我可以加载应用程序,点击第二个单元格中的视图,并将详细视图正确地推入屏幕。从那里,我回到桌面,滚动到底部,回到顶部,并点击相同的视图。从那里,应用程序崩溃与无法识别的选择器错误。这是我设置的手势(在viewDidLoad中):UITableView中的UIGestureRecognizer - 滚动后崩溃?

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

,这里是要调用的方法:

-(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]; 
    } 

最后,这里是堆栈跟踪我在控制台中看到:

*** 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 

'

编辑:此测试了一段时间后,我已经确定,只有意见ŧ帽子在屏幕上可见时会触发事件。所有其他崩溃与上述错误。可能与this未回答的问题?

这是我为清楚起见省略头声明(IVARS和属性:

@interface ArticleTileViewController : UIViewController<UIGestureRecognizerDelegate> { 

} 

-(void)handleTap:(UITapGestureRecognizer *)sender; 
+0

什么类是“自我”,它有一个handleTap实现? – willcodejavaforfood 2010-10-12 14:11:47

+0

self是ArticleTileViewController,它包含handleTap方法的实现 – 2010-10-12 14:15:24

+0

您的代码仅用于设置识别器委托才能调用可见的视图吗? – willcodejavaforfood 2010-10-12 14:15:41

基本上这问题意味着你将消息发送到一个对象,它不能识别该消息在所有的,即该方法是。缺少

你选择创造是不正确应该是:

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

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

--UPDATE--

recognizer.delegate = self; 

我询问道歉,但你肯定 '自我' 其实有方法handleTap:

+1

现在,当我点击视图时,我立即崩溃: - [__ NSCFType handleTap:]:无法识别的选择器发送到实例0x6271170 2010-10-12 09:42:22.505 FLUD [5284:207] ***终止应用程序到期未捕获的异常'NSInvalidArgumentException',原因:' - [__ NSCFType handleTap:]:无法识别的选择发送到实例0x6271170' – 2010-10-12 13:45:13

+0

更新后,您的意见:) – willcodejavaforfood 2010-10-12 13:51:58

+0

该方法是在我的头文件中声明,我声明类为UIGestureRecognizerDelegate在接口声明中。我错过了什么吗? – 2010-10-12 14:04:20

我想出了我做错了什么。在我的初始化代码中(来自另一个ViewController),我在将它们添加到UITableViewCell后发布了ArticleTileViewControllers。这导致一个对象被消息不再在内存中。

愚蠢的程序员错误!

如果您不想实施委托方法,则不需要将委托设置为自我。

UITapGestureRecognizer *touchGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTouchedTheView:)]; 
    [touchGesture setCancelsTouchesInView:NO]; 
    [self.tableView addGestureRecognizer:touchGesture]; 

如果您只实现userTouchedTheView:方法也可以。