2

カスタムセルを備えた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;
4

3 に答える 3

10

基本的に、この問題は、メッセージをまったく認識しないオブジェクトにメッセージを送信していることを意味します。つまり、メソッドが欠落しています。

セレクターの作成は正しくありません。次のようにする必要があります。

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

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

- アップデート -

recognizer.delegate = self;

質問して申し訳ありませんが、'self' が実際にメソッドを持っていることは確かhandleTap:ですか?

于 2010-10-12T12:28:40.337 に答える
2

私は自分が間違っていたことを理解しました。私の初期化コード (別の ViewController から) では、ArticleTileViewControllers を UITableViewCell に追加した後に解放していました。これにより、メモリ内に存在しないオブジェクトにメッセージが送信されていました。

愚かなプログラマの間違い!!

于 2010-10-12T18:31:53.740 に答える
0

デリゲート メソッドを実装しない場合は、デリゲートを self に設定する必要はありません。

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

userTouchedTheView: メソッドのみを実装する場合にも機能します。

于 2013-12-12T21:39:01.810 に答える