質問

タブビュー内にテーブルビューを持つiOSアプリを書いています。 UITableViewController -tableView:didSelectRowAtIndexPath:を実装しましたが、実行時に行を選択すると、メソッドは呼び出されません。ただし、テーブルビューにはデータが入力されているため、コントローラーの他のtableViewメソッドが呼び出されていることがわかります。

これを実現するために私が台無しにした可能性のあるアイデアはありますか?

役に立ちましたか?

解決

クラスはそのテーブルビューの UITableViewDelegate ではないようですが、 UITableViewController は自動的に設定することになっています。

デリゲートを他のクラスにリセットする可能性はありますか?

他のヒント

誰かが私と同じ愚かな間違いをした場合に備えて:

didSelect であることを期待するもののメソッド名が何らかの方法で誤って didDeselect を取得する可能性があるかどうかを確認します。見つけるのに約2時間かかりました...

問題の原因となる可能性がある別のことは、選択の種類が選択されていないことです:

UITableView選択の種類

通常の選択の場合は単一選択である必要があり、選択なしではない である必要があります。

別の可能性は、UITapGestureRecognizerがイベントを食べている可能性があることです。ここでの場合のように: https://stackoverflow.com/a / 9248827/214070

タップが通過するかのようにテーブルのセルが青で強調表示されるため、この原因は疑いませんでした。

すべての良い答えですが、注意すべき点がもう1つあります...

(特にプログラムでUITableViewを作成する場合)

[tableView setAllowsSelection:YES]; を設定するか、それを NO に設定する行を削除して、tableViewが選択に応答できることを確認します。

UITapGestureRecognizer で問題が発生した場合、これを修正できます:

  • ストーリーボード:

ここに画像の説明を入力

Objective-C を使用したコード:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap];

[tap setCancelsTouchesInView:NO];

Swift を使用したコード:

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false

この状況で2つのことに遭遇しました。

  1. UITableViewDelegateプロトコルの実装を忘れているか、クラスとテーブルビューの間に委任アウトレットがありません。

  2. 行内に、ファーストレスポンダーであり、クリックを奪うUIViewがある場合があります。 UIButtonまたは同様のものを言います。

同じ問題が発生しました。そして見つけるのは大変でした。しかし、私のコードのどこかに これ:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return nil;
}

return indexPath である必要があります。そうでない場合、 -tableView:didSelectRowAtIndexPath:は呼び出されていません。

UITableViewの上にGestureRecognizerを追加した場合、 didSelectRowAtIndexPath は呼び出されません。

したがって、特定のビューでのタッチを回避するには、gestureRecognizerデリゲートメソッドを使用する必要があります。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}

コードを確認していなかった数ヶ月後に、必要ではない要件のために次のメソッドを実装することを忘れていた問題に遭遇しました

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

選択するには、行に対してYESを返す必要があります。

これらのオプションを選択する必要があります

ここに画像の説明を入力してください

ただし、 UITableView をクリックしても強調表示されないようにするには、 UITableViewCell プロパティを変更する必要があります。

以下のように、選択に[なし]オプションを選択します

ここに画像の説明を入力してください

テーブルビューに UITapGestureRecognizer を配置して、 didSelectRowAtIndexPath:が呼び出されないようにするキーボードを閉じました。それが誰かを助けることを願っています。

あなたが私と同じ問題を抱えている場合: どうやら、tableViewが編集モードの場合、このメソッドは呼び出されません。 allowSelectionDuringEditingをtrueに設定する必要があります。

この質問を介して:編集時に、 `UITableView`はdidSelectRowAtIndexPathを呼び出しませんか?

同じ問題がありました、

理由は UITapGestureRecognizer の使用でした。他の場所をタップしたときにキーボードを消したかった。これがすべてのタップアクションをオーバーライドすることに気付きました。そのため、 didSelectRowAtIndexPath 関数は呼び出されませんでした。

UITapGestureRecognizer に関連する行にコメントすると、機能します。さらに、タップが UITableViewCell であるかどうかを UITapGestureRecognizer selector の機能で確認できます。

Xcode 6.4、Swift 1.2の場合。選択した「タグ」 IBで変更されていました。方法と理由がわかりません。 「単一選択」に設定します;テーブルビューのセルを再び選択可能にしました。 「ここに画像の説明を入力してください」

私の場合、didSelctRowAtIndexPathが呼び出されないのは、tableViewの Selection プロパティで none を選択し、単一選択に設定したためです問題を解決しました

ここに画像の説明を入力

別の回答が受け入れられたとしても、この問題を観察する人々のために、もう1つの考えられる問題と解決策を追加します。

自動参照カウント(ARC)がオンになっている場合、コントローラーをビューのデリゲートとして割り当てた後でも、ARCがコントローラーを削除しているため、コントローラーへのビューのメッセージが受信されないことがあります。どうやらUITableViewのデリゲートポインターはARCの参照としてカウントされないため、それへの唯一の参照である場合、コントローラーは割り当て解除されます。コントローラでdeallocメソッドを実装し、そこでブレークポイントまたはNSLog呼び出しを設定することで、これが起こっているかどうかを確認できます。

解決策は、もう必要ないことが確実になるまで、どこか他の場所にある強力な参照でコントローラーを追跡することです。

次のように、viewDidLoadメソッドでデータソースとデリゲートを設定することを忘れないでください:

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

私の問題は上記のどれでもありませんでした。そしてとてもラメ。しかし、私はそれが誰かを助けるならば、ここにそれをリストすると思いました。

tableViewController があります。これは「ベース」です。コントローラーを使用して、このコントローラーのサブクラスを作成します。 " base"の tableView:didSelectRowAtIndexPath ルーチンですべてのコードを書いていました。クラス。デフォルトでは、このルーチンはすべてのサブクラスでも作成されていることを完全に忘れています(何もするコードはありませんが)。そのため、アプリを実行すると、サブクラスバージョンのコードが実行され、何も実行されず、悲しくなりました。したがって、もちろん、サブクラスからルーチンを削除すると、mt" base"クラスルーチンと私はビジネスです。

わかっています。笑わないで。しかし、多分これは私が失った時間に誰かを救うでしょう...

これで2セントを差し上げます。

カスタムUITableViewCellがあり、セル全体をカバーするボタンがあったため、タッチが発生すると、セルではなくボタンが選択されました。

ボタンを削除するか、私の場合、ボタンのUser Interation Enableをfalseに設定します。これにより、セルが選択されました。

これを読んだとしても、それでも問題は解決しません。

カスタムセルがあり、チェックボックス" ユーザーインタラクションが有効"無効でした。だから、スイッチを入れるだけです。がんばろう。

これがあっただけで、過去に起こったように、メソッドを追加しようとしたときにオートコンプリートに注意を払わず、実際に tableView:didDeselectRowAtIndexPath tableView:didSelectRowAtIndexPath:の代わりに。

古いことを知っており、問題は解決しましたが、同様の問題があり、カスタムUITableViewCellに問題があると思いましたが、解決策は完全に異なっていました-XCodeを再起動します:)そして正常に動作します!ほとんどWindowsのようです:)

テーブルビューが編集モードの場合(例: [tableView setEditing:YES animated:NO]; )、 tableView.allowsSelectionDuringEditing = YES; を設定する必要があります。

tableView:didDeSelectRowAtIndexPath

ではなく、 tableView:didSelectRowAtIndexPath を実装したことを確認してください

これは数回以上私に届いています!!

別の間違い(私がしたように):セルにセグエを設定した場合、 didSelectRowAtIndexPath は呼び出されません。代わりに、View Controllerでセグエを設定する必要があります。

これらの答えのどれも私にとってはうまくいきませんでした。約1時間後、私は非常に陰湿な何かを見つけました:

別のテーブルビューのセル内にテーブルビューがあります。特に、内部テーブルビューを含む囲みビューを作成することにしました。このビューをcontentViewと呼び、xibに接続しました。

UITableViewCellには既にcontentViewがあり、それを使用して奇妙なことを実行します。プロパティの名前をmainContentViewに変更し、ビューをこの名前を変更したプロパティに再接続すると、問題は解決しました。

私の場合、ロード時に TableView SuperView の高さを動的に計算します。計算ミスにより、 TableView SuperView の外側に配置されました。 TableView は正常に描画されましたが、すべての対話は無効になっています(そして didSelectRowAtIndexPath は呼び出されませんでした)。 TableView が「アクセス可能」ではないことを視覚的に示すことができないため、検出が非常に困難です。

私の場合、解決策は以下の機能でNOをYESに変更することでした。

iOS 9以降

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

さて、この問題にぶつかりましたのでここで更新しました。私の問題はここで見つかったものとは少し異なりました。

IBを見て、デリゲートWASが設定されているのを確認しましたが、ファイルの所有者ではなくVIEWに誤って設定されています(テーブルビューを右クリックして、デリゲートが指している場所を確認します)。

誰かを助ける希望

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top