タブ ビュー内にテーブル ビューを持つ iOS アプリを作成しています。私のUITableViewController
では を実装-tableView:didSelectRowAtIndexPath:
しましたが、実行時に行を選択すると、メソッドが呼び出されません。ただし、テーブル ビューには値が設定されているため、コントローラー内の他の tableView メソッドが呼び出されていることがわかります。
これを実現するために私が何を台無しにしたのか、誰か考えがありますか?
タブ ビュー内にテーブル ビューを持つ iOS アプリを作成しています。私のUITableViewController
では を実装-tableView:didSelectRowAtIndexPath:
しましたが、実行時に行を選択すると、メソッドが呼び出されません。ただし、テーブル ビューには値が設定されているため、コントローラー内の他の tableView メソッドが呼び出されていることがわかります。
これを実現するために私が何を台無しにしたのか、誰か考えがありますか?
誰かが私と同じ愚かな間違いをした場合に備えて:
期待するメソッド名didSelect
が誤って取得didDeselect
されていないか確認してください。私が見つけるのに約2時間かかりました...
問題につながる可能性があるもう 1 つのことは、選択されていない選択の種類です。
Single Selection
通常の選択用であるべきであり、すべきではありませんNo Selection
。
これをプログラムで行うには、次のようにします。
tableView.allowsSelection = YES
別の可能性は、ここの場合のように、UITapGestureRecognizer がイベントを食べている可能性があることです: https://stackoverflow.com/a/9248827/214070
タップが通過したかのように表のセルがまだ青くハイライトされていたので、私はこの原因を疑っていませんでした。
すべて良い答えですが、もう 1 つ注目すべきことがあります...
(特に、プログラムで UITableView を作成する場合)
[tableView setAllowsSelection:YES];
に設定する行を設定または削除して、tableView が選択に応答できることを確認しますNO
。
自動的に設定されるはずですが、おそらくクラスはUITableViewDelegate
そのテーブルビュー用ではないようです。UITableViewController
デリゲートを他のクラスにリセットする可能性はありますか?
問題が発生した場合は、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つのことに遭遇しました。
UITableViewDelegate プロトコルを実装するのを忘れているか、クラスとテーブル ビューの間に委任アウトレットがない可能性があります。
行内にファーストレスポンダーであり、クリックを奪う UIView がある場合があります。UIButton などと言ってください。
私は同じ問題を抱えていました。そして、見つけるのが大変でした。しかし、私のコードのどこかにこれがありました:
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
return nil;
}
である必要がありますreturn indexPath
。それ以外の-tableView:didSelectRowAtIndexPath:
場合は呼び出されていません。
私と同じ問題がある場合:どうやら、tableView が編集モードの場合、このメソッドは呼び出されません。allowSelectionDuringEditing を true に設定する必要があります。
この質問を介して:編集時、`UITableView` は didSelectRowAtIndexPath を呼び出さない ??
私は同じ問題を抱えていました、
その理由は、の使用でしUITapGestureRecognizer
た。他の場所をタップしたときにキーボードを閉じる必要がありました。これはすべてのタップ アクションをオーバーライドすることに気付きました。そのため、didSelectRowAtIndexPath
関数が呼び出されませんでした。
に関連する行にコメントを付けるとUITapGestureRecognizer
、機能します。UITapGestureRecognizer selector
また、タップされているかどうかの関数で確認できますUITableViewCell
。
次のように、viewDidLoadメソッドでデータソースとデリゲートを設定することを忘れないでください。
[self.tableView setDelegate:self];
[self.tableView setDataSource:self];
別の回答が受け入れられましたが、この問題を観察した人のために、考えられる問題と解決策をもう 1 つ追加します。
自動参照カウント (ARC) がオンになっている場合、コントローラをビューのデリゲートとして割り当てた後でも、ARC がコントローラを削除しているため、コントローラへのビューのメッセージが受信されないことがあります。どうやら、UITableView のデリゲート ポインターは ARC の参照としてカウントされないため、それが唯一の参照である場合、コントローラーは解放されます。コントローラーに dealloc メソッドを実装し、そこにブレークポイントまたは NSLog 呼び出しを設定することで、これが発生しているかどうかを確認できます。
解決策は、コントローラーがもう必要なくなることが確実になるまで、別の場所で強力な参照を使用してコントローラーを追跡することです。
私の問題は上記のどれでもありませんでした。そしてとても不自由です。しかし、誰かに役立つ場合に備えて、ここにリストすると思いました。
tableViewController
「ベース」コントローラーである があり、このコントローラーのサブクラスを作成します。tableView:didSelectRowAtIndexPath
「基本」クラスのルーチンにすべてのコードを書いていました。私のすべてのサブクラスにもデフォルトでこのルーチンが作成されていたことを完全に忘れていました (何も実行するコードはありませんでしたが)。そのため、アプリを実行すると、コードのサブクラス バージョンが実行され、何もせず、悲しくなりました。もちろん、サブクラスからルーチンを削除すると、mt "base" クラス ルーチンが使用され、ビジネスが開始されます。
知っている。笑わないで。でも、これで私が失った時間を誰かが救えるかもしれません...
これに私の2セントを与えます。
カスタムUITableViewCellがあり、セル全体を覆うボタンがあったため、タッチが発生すると、セルではなくボタンが選択されました。
ボタンを削除するか、私の場合は、ボタンで User Interation Enable を false に設定して、セルが選択されているようにします。
これを読んでも問題は解決しません。
チェックボックス「 User Interaction Enabled」が無効になっているカスタムセルがあります。だから、私はそれをオンにするだけです。幸運を。
実装tableView:didSelectRowAtIndexPath
していないことを確認してくださいtableView:didDeSelectRowAtIndexPath
これは何度か私を手に入れました!!
私はこれを持っていましたが、過去に起こったように、メソッドを追加しようとしたときにオートコンプリートに注意を払わなかったため、機能しませんでしtableView:didDeselectRowAtIndexPath
たtableView:didSelectRowAtIndexPath:
。
UITapGestureRecognizer を確認してください。私の場合、テーブルビューが配置されたビューにタップジェスチャが追加されました。これは、didselect のような UITableview のユーザー操作を食べています。ビューのタップジェスチャーを無効にした後、didselect デリゲートがトリガーされました。
テーブル ビューが編集モードの場合 (例: [tableView setEditing:YES animated:NO];
)、設定する必要があります。tableView.allowsSelectionDuringEditing = YES;
viewController
次の方法があるかどうかを確認します。
- (BOOL) tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
return NO;
}
「NO」を返すと、didSelectRow は呼び出されません
もう 1 つの間違い (私がしたように): セルにセグエを設定すると、didSelectRowAtIndexPath
呼び出されません。代わりに、View Controller でセグエを設定する必要があります。
私の場合、問題はサブクラスがあり、UITableViewCell
次の 2 つのメソッドを実装
したことでした。しかし、メソッド adを追加して、セルの親にもタッチを通知するのを忘れていました。touchesBegan:withEvent:
touchesEnded:withEvent
[super touchesBegan:touches withEvent:event];
[super touchesEnded:touches withEvent:event];
したがって、コードを次のように変更すると、問題が解決しました。
-(void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event{
[super touchesBegan:touches withEvent:event];
//blah blah blah
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesEnded:touches withEvent:event];
//rest of the code
}
これらの答えはどれもうまくいきませんでした。約1時間後、私は非常に陰湿な何かを見つけました:
別のテーブル ビューのセル内にテーブル ビューがあります。とりわけ、内側のテーブル ビューを含む囲みビューを作成することにしました。このビューを contentView と呼び、xib に接続しました。
UITableViewCell には既に contentView があり、奇妙なことを行っていることがわかりました。プロパティの名前を mainContentView に変更し、この名前を変更したプロパティにビューを再接続すると、問題は解決しました。
私は古いことを知っていて、問題は解決されましたが、同様の問題がありました.問題は私のカスタム UITableViewCell にあると思いましたが、解決策は完全に異なっていました-XCodeを再起動します:)そして正常に動作します! ほとんどWindowsと同じです:)
私の場合、読み込み時にTableView
の高さを動的に計算します。SuperView
計算ミスにより、 が のTableView
外に配置されましたSuperView
。はTableView
正常に描画されましたが、すべての対話が無効になりました (そしてdidSelectRowAtIndexPath
呼び出されませんでした)。TableView
が「アクセス可能」でないことを視覚的に示すものがないため、検出が非常に困難です。
ストーリーボードのプロパティに注意してくださいUITableView
。私の場合、ストーリーボードのコンボックスが「選択: 単一選択」として選択されていたため、メソッドdidSelectRowAtIndexPath
を実行できませんでした。
この投稿にはいくつかの驚くべき手がかりと答えがあります (おそらく私が見た中で最高の議論の 1 つです!) ここの手がかりは、私の問題が何であるかを理解するのに役立ちましたが、それでも何時間もキーボードでよだれを垂らしながら、これは他の投稿と似ていました。しかし、最終的にそれを発見した方法は少し異なっていたので、他の人がそれに出くわした場合に備えて共有したいと思いました.
私の問題は、コードでは、スーパークラスが非表示ではなく透明なフルスクリーンの「エラービュー」を追加していたことでした。しかし、それはテーブルビュー上であり、「ユーザーアクション」が YES に設定されていたため、テーブルビューへの私のタッチを傍受していました。
これは、Xcode のクールな [Debug View Hierarchy] ボタンを使用して診断しました。これは、私が行ったことと、最終的に問題をどのように診断したかを説明する注釈付きのスクリーン ショットです。
コードでは、次のことを行うだけで済みました。
errorMessageView.setUserInteractionEnabled = NO;
// or
errorMessageView.hidden = YES;
この問題に遭遇したので、ここで更新します。私の問題は、ここで見つかったものとは少し異なります。
IB を調べたところ、デリゲートが WAS に設定されていることがわかりましたが、ファイルの所有者ではなく VIEW に誤って設定されていました (テーブル ビューを右クリックして、デリゲートが指している場所を確認してください)。
誰かを助けることを願っています
私の場合、この問題が発生していたのは 1 つのセルだけでした。セルには、読み取り専用モードの UITextView アウトレットが含まれていました。タップ前は読み取り専用でしたが。タップすると、キーボードが上がりました。インタラクションを無効にする必要があることが判明しました。
cell.content.scrollEnabled = NO;
cell.content.editable = NO;
cell.content.userInteractionEnabled = NO;
cell.content.delegate = nil;
[cell.content rejectFirstResponder];
これはおそらく私の場合だけでしたが、バックアップからいくつかのファイルをリロードしましたが、これを含めてうまくいきませんでした。完全なクリーンを実行した後(製品>クリーンまたはShift + Command + K)、機能しました。おそらく、プリコンパイル済みヘッダーで何かがおかしくなったのでしょう。それはあなたにとって問題ではない可能性がありますが、試してみる価値はあります。
-heightForRowAtIndexPath が 0 を返さないかどうかを確認します。
以前のすべての回答を繰り返しましたが、どれも役に立ちませんでした。試行錯誤の末、別の解決策を見つけました。セル全体を(背景として)カバーする UIImageView がありました。デフォルトでは、UIImageView のユーザー操作は無効になっています。imageviews ユーザー インタラクション デリゲート メソッド -didSelectRowAtIndexPath: を有効にすることで、再度呼び出されました。例えば。
cell.imgView.userInteractionEnabled = YES;
カスタム セルがある場合は、セルの Xib で (またはコードを介して) UserInteractionEnabled を設定することを忘れないでください。
この問題が発生したばかりですが、すぐには発生しませんでした。いくつかのセルを選択すると、呼び出しが停止しdidSelectItemAtIndexPath
ます。allowsMultipleSelection
問題は、コレクション ビューがTRUE に設定されていることに気付きました。セルの選択が解除されることはなかったため、今後の呼び出しで が呼び出されなくなりましたdidSelectItemAtIndexPath
。
私は自分でこの問題を抱えていました。IB でビューのボーン (View と TableView のみ) を作成しましたが、デリゲートは設定されていませんでした。ファイルの所有者に配線したところ、魅力的に機能しました。::保存::
カスタマイズされたテーブル コードに埋め込まれた cell.userInteractionEnabled への呼び出しがありました。
ばかげていますが、ほとんどのバグではありませんか?
ブレークポイントを適用した後、コントロールが didselect 行に入らないという問題がありました。問題が見えてきました。ビューからタブ ジェスチャを削除しました。その後、うまくいきました
の が で正しく設定されていなかったclass name
ときに、この問題が発生しました。TableViewController
Interface Builder
この選択を確認する必要があります 単一選択である必要があり、編集中は編集が選択されていない必要があります uttableviewcell プロパティの設定を変更します テーブルビューで編集する セルスタイルはカスタムである必要があり、識別子は Rid である必要があり、セクションはなしです
reloadData
必ずメインスレッドで呼び出してください。ある種の非同期メソッド (例: ある種のネットワーク要求) からそのメソッドを呼び出している場合、テーブル ビューが適切に応答する場合としない場合があります (場合によっては、アプリがクラッシュすることさえあります)。
呼び出しが他のメソッド ブロックで行われている場合 (不明な場合) は、メイン スレッド コード ブロックを使用してreloadData
呼び出しを実行します。
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[tableView reloadData];
}];