16

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

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

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

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

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

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

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

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

4

9 に答える 9

11

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

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

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

于 2012-10-24T17:46:52.440 に答える
8

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

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

于 2012-10-01T17:38:22.503 に答える
6

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

私も実装しました

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

NOを返しました。iOS5ではすべて正常に動作していましたが、iOS6に切り替えた瞬間にdidSelectRowAtIndexPath. そのメソッドを削除するとshouldHighlightRow、すべてが iOS6 で再び機能しました。乾杯!

于 2012-12-20T16:51:53.267 に答える
5

didSeletRowAtIndexPath()呼び出されない通常の理由はUITapGestureRecognizer、viewcontroller にCancels touchesin view が に設定されていることYESです。

正しい唯一の賢明な修正はCancels touches、ビューを に設定することNOです。次に、テーブルの行の選択がうまく機能するはずです。

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

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

    if (sender.view == someOldViewThatINeedToDealWith) {
        sender.cancelsTouchesInView = true;
    }
}
于 2014-07-08T14:51:40.393 に答える
4

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

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

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

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

お役に立てれば。

于 2013-09-30T17:56:24.473 に答える
2

もう 1 つの容疑者は、View Controller のビューに設定された Tap Gesture Recognizer で、すべてのタップをブラックホールのように飲み込んでいる可能性があります。ジェスチャ レコグナイザーを削除すると、did select が有効になります。同じ問題が発生したばかりで、タップジェスチャーが原因でした。

于 2014-12-21T06:59:53.137 に答える
1

解決策は本当に奇妙です: UITableViewController はすべての通知に登録されています。通知のハンドラーで、テーブル ビュー データが次を使用してリロードされていました。

[self.tableView reloadData]

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

ときどき機能する理由や、iPhone で常に機能する理由についての説明はありません。しかし、通知の小さなサブセット (つまり、私が本当に興味を持っていたもの)のみを登録することで、問題が解決しました!

于 2012-10-31T21:04:20.870 に答える
0

私の場合、tableviewcellの前にすべてのタッチイベントを受け取ったボタンを持っていました

于 2014-07-25T11:05:23.553 に答える