web-dev-qa-db-ja.com

didSelectRowAtIndexPath:呼び出されていません

UITableViewのサブビューとしてUIScrollVIewがあります。これは、MainViewControllerによって制御されるメインビューです。

MainViewController.hで

@interface MainViewController : UIViewController <UIGestureRecognizerDelegate, UITableViewDelegate, UITableViewDataSource>

// other stuff here...

@property (weak, nonatomic) IBOutlet UITableView *myTableView;

MainViewController.mで

@synthesize myTableView;

// other stuff here...

- (void)viewDidLoad {
    myTableView.delegate = self;
    myTableView.datasource = self;
}

// other stuff here...

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
   [self performSegueWithIdentifier:@"listAttributesSegue" sender:self];
}

メソッド自体とその中のコード行の両方にブレークポイントを設定しており、どちらも呼び出されていないため、didSelectRowAtIndexPathが呼び出されていないことを知っています。また、実行時にセルを変更する他の関数があり、それらが完全に正常に機能しているため、データソースが正しく機能していることも知っています。 iOS 5.0を開発ターゲットとして設定した最新のXcodeを使用しています。私は答えを探しました。誰にもアイデアはありますか?

編集:答えを見つけました。 myTableViewのsuperViewにUITapGestureRecognizerを設定しました。これにより、選択呼び出しが無効になりました。それがそうであるかもしれないと提案した誰にでも信用。あなたの答えは、正しいとマークする前に削除されました。

編集2:多くの人々がこれについてコメントしているので、私はそれを共有したいと思います。この問題が発生している場合は、単にmyGestureRecognizer.cancelsTouchInViewからfalseに変更すると、すべて正常に動作するはずです。

57
Garrett

答えを見つけました。 myTableViewのsuperViewにUITapGestureRecognizerを設定しました。これにより、選択呼び出しが無効になりました。それがそうであるかもしれないと提案した誰にでも信用。あなたの答えは、正しいとマークする前に削除されました。

ジェスチャレコグナイザーでcancelsTouchesInViewプロパティをNOに設定して、Table Viewがイベントをインターセプトできるようにします。

286
Garrett

Swift 3:

コードでUITapGestureRecognizerを使用している場合:-#Swift以下のコード行を使用:

extension YourViewController{
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.dismissKeyboard))
        view.addGestureRecognizer(tap)
        tap.cancelsTouchesInView = false
    }

    func dismissKeyboard() {
        view.endEditing(true)
    }
}

呼び出し方法:-ViewDidLoad()

self.hideKeyboardWhenTappedAround()
12
Kiran jadhav

あなたの問題は大文字小文字の区別です。あなたのコード:

- (void)tableVIew:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {

あるべき

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
10
A. Wilcox

結局それはタイプミスかもしれません。関数がdidDeselectRowAtIndexPath:de selectではなくselect)でないことを確認してください。

7
Mundi

同じ名前でtableviewのインスタンス変数を定義しました。そうでない場合、これが問題になる可能性があります-

_myTableView.delegate = self;
_myTableView.datasource = self;

または

self.myTableView.delegate = self;
self.myTableView.datasource = self;
7
rishi

私の解決策は次のとおりです。

  1. cancelsTouchesInViewを任意のtapGestureのNoに設定します

  2. カスタムセルでuserInteractionEnableNOに設定され、単にuserInteractionEnable = Noおよび問題は解決しました。

5
PeiweiChen

必要なビュー以外のビューのタッチをキャンセルします。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {
    if (touch.view == your view) {
        return YES;
    }
    return NO;
}
3
MuraliMohan

申し訳ありませんが、コメントを追加するのに十分なポイントがありません-ギャレットの答えは素晴らしいですが、私は追加します:

ジェスチャレコグナイザーは引き続き使用できますが、「ビュー内のタッチをキャンセルする」をNOに設定する必要があります。ジェスチャはビューに渡され、UITableViewは正常に機能します。

多くの多くのアプローチを試した後、これは正しい方法のようです:「ビューのタッチをキャンセル」するタップジェスチャレコグナイザーは、すべての上に不可視のレイヤーを持ち、すべてのイベントを取得してView Controllerにルーティングするようなものです(プロキシ)。次に、View Controllerはジェスチャを見て、アクションバインディング(ボタンなど)があるかどうかを確認し、それらをルーティングし、残りはジェスチャハンドラに移動します。 UITableViewを使用する場合、タップを受信することを期待していますが、「ビュー内のタッチをキャンセルする」場合、View Controllerはタップを無効にします。

1
Oliver Dungey

私の場合は奇妙です。私のtableViewには2つのセクションがあります。 1番目のセクションのセルはtableView:didSelectRowAt:について正常に機能しますが、2番目のセクションのセルはdidSelectRowAt:をトリガーしません。

上記の問題はiPhone 4s, iOS 9.3で発生します。しかし、iPhone 5s, iOS 10.3では、問題はありません。これらのセルは正常に機能します。 iOS 9UITableViewに関するバグのようです。

多くのテストの後、1行のコードでこのバグが発生することがわかりました。

tableView.estimatedSectionHeaderHeight = 60.0

2番目のセクションにはヘッダービューがないためです。この行を削除すると、すべて正常に動作します。

1
AechoLiu

私はしばらくの間この問題を抱えていましたが、ここでそれを参照していなかったので、参照のために、これの別の理由は次のとおりです:

tableView.editing = YES;

しかし

tableView.allowsSelectionDuringEditing = NO;

のドキュメントに従って

- tableView:didSelectRowAtIndexPath:

このメソッドは、テーブルの編集プロパティがYESに設定されている場合は呼び出されません(つまり、テーブルビューは編集モードです)。このメソッドに関連する詳細情報(およびコード例)については、iOS用のテーブルビュープログラミングガイドの「選択の管理」を参照してください。

1
Bamaco

DidSelectRowAtIndexPath:のカスタムセルプレスで呼び出されるという断続的な障害がありました。

[tableView reloadData]の呼び出しを頻繁に(10 Hz)停止し、2秒ごとに更新するように変更すると、ほとんどすべてのプレスがdidSelectRowAtIndexPathを正常に呼び出すことがわかりました。

ビューブロックをリロードすると、プレスがブロックされるようです。

0
aaronsti

ユーザーは、「tableView.selectRowAtIndexPath(..)」または「cell.setSelected(true、...)」を呼び出して、セルを選択できます(行をタップします)。

  • 「cell.setSelected(true)」を呼び出してセルを選択すると、ユーザーはセルの選択を解除できなくなります。

  • 「tableView.selectRowAtIndexPath()」を呼び出してセルが選択された場合、ユーザーは期待どおりにセルの選択を解除できます。

0