web-dev-qa-db-ja.com

iOS:UITableViewをタップしてもdidSelectRowAtIndexPathは呼び出されません

私のアプリは、UITableViewUINavigationControllerを使用して、テーブルの行がタップされたときに、より詳細なビューを表示します。これは、基本的なドリルダウンルーチンです。

行をタップすると強調表示されますが、デリゲートメソッドはtableView:willSelectRowAtIndexPath:またはtableView:didSelectRowAtIndexPath:は呼び出されません(デバッガーを使用して確認されます)。

今ここに奇妙な部分があります:

  1. アプリには他にもいくつかのテーブルビューがあり(ドリルダウンしません)、いずれも問題を示していません。

  2. 行をすばやく繰り返しタップすると、何度も試行した後(10〜20が正常です)、tableView:willSelectRowAtIndexPath:およびtableView:didSelectRowAtIndexPath:areが呼び出され、処理は正常に続行されます。

  3. この問題は、iOS 6を実行している(実際には)iPadでのみのみ発生します。iOS5を実行しているiPad、またはiOSバージョン6を実行しているiPhoneで正常に動作します。 iOS5または6を使用するiPadシミュレーターで動作します。

したがって、デリゲートメソッドが呼び出される前に何かがタップを受け取っているようです。しかし、何ですか?

私はUITapGestureRecognizerを使用していないので、 それは問題ではありません 。テーブルに複数のUITableViewControllersを使用していないので、 これも問題ではありません

16
Anton Meyer

解像度は本当に奇妙です:UITableViewControllerはall通知に登録されています。通知のハンドラーで、テーブルビューデータがを使用して再読み込みされていました

[self.tableView reloadData]

Apple DTSによると、テーブルがデータをリロードすると、オブザーバーに通知が送信され、競合状態が発生します...

なぜそれが時々動作するのか、なぜそれが常にiPhoneで動作するのかについての説明はありません。しかし、通知の小さなサブセット(つまり、私が本当に興味を持っていたもの)にのみを登録すると、問題が修正されました!

1
Anton Meyer

IOS6で実行しているときに、アプリでこの問題が発生していました。 tableView:didSelectRowAtIndexPath:メソッドは、iOS6に更新する前に機能していましたが、トリガーされることはありませんでした。

Xibとテーブルの属性インスペクターを見て、最終的にそれを理解しました。テーブルビューセクションで、選択オプションを選択なしに設定し、タッチで選択を表示が選択されていませんでした。

選択オプションを単一選択に変更すると、実際にこれが再び機能し、タッチで選択を表示を選択しないままにすると、表示されなくなります行が選択されたときのフラッシュまたは色の変化。

11
AidenMontgomery

同様の問題が発生しました。 iOS 6は、テーブルビューセルをタップしたときのわずかな上向きの動きに対してはるかに敏感であるように見えます。わずかな動きをセル選択ではなくスクロール要求として登録しているようです。テーブルビューは静的な選択値を持つテーブルビューであるため、scrollEnabled = NOに設定されました。テーブルビューは、大きなiPadビューの小さな領域内に表示されます。セルを注意深くタップして直接持ち上げると、セルが選択されます。

これを解決するために、scrollEnabledYESに変更し、tableView専用の領域が、テーブルビューを表示するために必要な実際の領域よりも大きいことを確認して、スクロールできないようにしました。これが発生している問題の原因であるかどうかはわかりませんが、お役に立てば幸いです。

8
Kynerd

私も同じ問題を抱えていました。 UITableViewは、iOS6で実行しているときにdidSelectRowAtIndexPathメソッドをトリガーしていませんでしたが、iOS5.1では正常に機能していました。

私も実装しました

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath{
    return NO;
}

そしてNOを返しました。 iOS5ではすべて正常に機能していましたが、iOS6に切り替えると、didSelectRowAtIndexPathのトリガーが停止しました。そのshouldHighlightRowメソッドを削除すると、すべてがiOS6で再び機能しました。乾杯!

6
bolnad

didSeletRowAtIndexPath()が呼び出されない通常の理由は、ビューのCancels touchesUITapGestureRecognizerに設定されたビューコントローラーにYESがあることです。

正しくて唯一の賢明な修正は、ビューでCancels touchesNOに設定することです。そうすれば、テーブルの行の選択がうまく機能するはずです。

明らかに、これはジェスチャハンドラにいくつかの影響を及ぼします。ビューへのタッチを停止するために、ジェスチャハンドラにコードを追加する必要がある場合があります。

- (IBAction)onTapGesture:(UITapGestureRecognizer *)sender {

    if (sender.view == someOldViewThatINeedToDealWith) {
        sender.cancelsTouchesInView = true;
    }
}
5
Oliver Dungey

投稿された他のすべての回答を試しましたが、有望に見えましたが、問題は解決しませんでした。

それ以来、私の場合、問題の原因を発見しました。別のスレッドで[self.tableView reloadData]を呼び出していました(バックグラウンドワーカースレッドから投稿されたNSNotificationイベントを処理するため)。

[self.tableView reloadData]をに変更して問題を修正しました

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

お役に立てれば。

4

他の容疑者は、ブラックホールのようにすべてのタップを飲み込むビューコントローラーのビューに設定されたタップジェスチャ認識機能である可能性があります。ジェスチャレコグナイザを削除すると、選択が有効になります。同じ問題が発生し、タップジェスチャが原因でした。

2
naz

設定

recognizer.cancelsTouchesInView = NO;

ユースケースで[タップ]ジェスチャレコグナイザー(kdb dismissなど)によるタッチの同時処理と、レコグナイザーがアタッチされているビューが許可されている場合は、それを処理します。

1
Anton Tropashko

私の場合、uitableviewcellの前にすべてのタッチイベントを受信したボタンがあります

0