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;
基本上这问题意味着你将消息发送到一个对象,它不能识别该消息在所有的,即该方法是。缺少
你选择创造是不正确应该是:
UIGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
和
- (void) handleTap:(UITapGestureRecognizer *)sender {
--UPDATE--
recognizer.delegate = self;
我询问道歉,但你肯定 '自我' 其实有方法handleTap:
?
现在,当我点击视图时,我立即崩溃: - [__ NSCFType handleTap:]:无法识别的选择器发送到实例0x6271170 2010-10-12 09:42:22.505 FLUD [5284:207] ***终止应用程序到期未捕获的异常'NSInvalidArgumentException',原因:' - [__ NSCFType handleTap:]:无法识别的选择发送到实例0x6271170' – 2010-10-12 13:45:13
更新后,您的意见:) – willcodejavaforfood 2010-10-12 13:51:58
该方法是在我的头文件中声明,我声明类为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:方法也可以。
什么类是“自我”,它有一个handleTap实现? – willcodejavaforfood 2010-10-12 14:11:47
self是ArticleTileViewController,它包含handleTap方法的实现 – 2010-10-12 14:15:24
您的代码仅用于设置识别器委托才能调用可见的视图吗? – willcodejavaforfood 2010-10-12 14:15:41