uigterViewのuigesturerecognizer-スクロール後にクラッシュしますか?
-
29-09-2019 - |
質問
カスタムセルを使用したuitableviewがあります。各セルの内側には2つのビューがあります。各ビューには、タップイベントを処理するために接続されたuigesturerecognizerがあります。ビューがタップされたら、uinavigationcontrollerにメッセージを送信して、詳細ビューをプッシュします。このシナリオは、実際にテーブルをスクロールするまで正常に機能します。テーブルがスクロールされた後、ユーザーがセル内のビューの1つをタップすると、アプリがクラッシュします。たとえば、アプリをロードし、2番目のセルのビューをクリックして、詳細ビューを表示することができます。そこから、テーブルに戻り、下にスクロールし、上部に戻り、同じビューをタップします。そこから、アプリは認識されていないセレクターエラーでクラッシュします。ジェスチャーのための私のセットアップは次のとおりです(ViewDidload):
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
'
編集:しばらくこれでテストした後、私はその時点で画面に表示されているビューだけがイベントを発射すると判断しました。他のすべては、上記のエラーでクラッシュします。に関連する可能性があります これ 未回答の問題?
これが私のヘッダー宣言です(明確にするために省略されているivarsとプロパティ:
@interface ArticleTileViewController : UIViewController<UIGestureRecognizerDelegate> {
}
-(void)handleTap:(UITapGestureRecognizer *)sender;
解決
基本的に、この問題は、メッセージをまったく認識しないオブジェクトにメッセージを送信していることを意味します。つまり、メソッドが欠落しています。
あなたのセレクターの作成は間違っているはずです:
UIGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
と
- (void) handleTap:(UITapGestureRecognizer *)sender {
- アップデート -
recognizer.delegate = self;
私は尋ねたことをお詫びしますが、あなたは「自己」が実際に方法を持っていることを確信していますか handleTap:
?
他のヒント
私は自分が間違っていることを理解しました。私の初期化コード(別のViewControllerから)では、uitableviewcellに追加した後、articletileviewcontrollersをリリースしていました。これにより、メモリにはなくなったオブジェクトがメッセージが表示されていました。
愚かなプログラマーミス!!
委任状を実装したくない場合は、代表者を自己に設定する必要はありません。
UITapGestureRecognizer *touchGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTouchedTheView:)];
[touchGesture setCancelsTouchesInView:NO];
[self.tableView addGestureRecognizer:touchGesture];
また、usertouchedtheview:methodのみを実装する場合にも機能します。