の行をタップするとUITableView
、その行が強調表示されて選択されます。これを無効にして、行をタップしても何も起こらないようにすることはできますか?
の行をタップするとUITableView
、その行が強調表示されて選択されます。これを無効にして、行をタップしても何も起こらないようにすることはできますか?
回答:
私にとって、以下はうまくいきました:
tableView.allowsSelection = false
これはdidSelectRowAt#
単に機能しないことを意味します。つまり、テーブルの行に触れても、まったく何も起こりません。(したがって、明らかに、選択されたアニメーションはありません。)
(セル上に、UIButton
またはその他のコントロールがある場合、もちろんそれらのコントロールは引き続き機能します。テーブルセル上にあるコントロールはすべて、UITableViewの「行の選択」を可能にする機能とはまったく関係ありません。を使用しdidSelectRowAt#
ます。)
注意すべきもう1つの点UITableView
は、が編集モードの場合は機能しません。編集モードでセルの選択を制限するには、次のコードを使用します。
tableView.allowsSelectionDuringEditing = false
selectionStyle
セルのプロパティを設定する必要があります:cell.selectionStyle = UITableViewCellSelectionStyle.None
Swiftまたはcell.selectionStyle = UITableViewCellSelectionStyleNone
Objective-Cで。
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
を呼び出す場合cell.selectionStyle = .None
は、が必要です。そのデリゲート関数が呼び出されないようにしたい場合(つまり、tableViewCellにテキストフィールドがある場合)の設定tableView.allowsSelection = false
は問題ありません。
次のUITableViewCell
いずれかを使用して、インスタンスに選択スタイルを設定するだけです。
Objective-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
または
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
スウィフト2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3および4.x:
cell.selectionStyle = .none
さらに、-tableView:didSelectRowAtIndexPath:
テーブルビューデリゲートに実装しないか、実装する場合はアクションを実行しないセルを明示的に除外するようにしてください。
私は最近この記事を読んだことがあり、それが役に立ったので、別の回答を投稿してすべての回答を統合したいと思いました(後世のため)。
したがって、実際には、必要なロジックや結果に応じて5つの異なる答えがあります。
1.セルの他の相互作用を変更せずに青色の強調表示を無効にするには:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
UIButtonまたは他のいくつかのコントロールがUITableViewCellでホストされており、ユーザーがセル自体ではなくコントロールと対話できるようにしたいときに、これを使用します。
注:Tony Millionが前述したように、これは妨げるものではありませんtableView:didSelectRowAtIndexPath:
。私は単純な「if」ステートメントでこれを回避します。ほとんどの場合、セクションをテストし、特定のセクションのアクションを回避します。
このようなセルのタッピングをテストするために私が考えた別の方法は、次のとおりです。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// A case was selected, so push into the CaseDetailViewController
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
// Handle tap code here
}
}
2.これをテーブル全体に対して行うには、上記のソリューションをテーブルの各セルに適用できますが、これを行うこともできます。
[tableView setAllowsSelection:NO];
私のテストでは、これにより、内部のコントロールをUITableViewCell
インタラクティブにすることができます。
3.セルを「読み取り専用」にするには、次のようにします。
[cell setUserInteractionEnabled:NO];
4.テーブル全体を「読み取り専用」にする
[tableView setUserInteractionEnabled:NO];
5.セルを強調表示するかどうかをオンザフライで決定するには(この回答によれば暗黙的に選択が含まれます)、次のUITableViewDelegate
プロトコルメソッドを実装できます:
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
tableView:shouldHighlightRowAtIndexPath:
、のシャウトアウトを追加してください。これは一般的に(常にではありませんが)私の推奨するアプローチです。
私が信じていることを要約すると、これを実装した自分の経験に基づく正しい答えです:
一部のセルのみの選択を無効にする場合は、次を使用します。
cell.userInteractionEnabled = NO;
これにより、選択が防止されるだけでなく、設定されているセルに対して呼び出されるtableView:didSelectRowAtIndexPath:も停止します。(クレジットはこの答えをトニーミリオンに送ってくれてありがとう!)
クリックする必要のあるボタンがセルにある場合は、代わりに次の操作を行う必要があります。
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
また、のセルをクリックしても無視する必要があります- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
。
テーブル全体の選択を無効にするには、次を使用します。
tableView.allowsSelection = NO;
(Paulo De Barrosへのクレジット、ありがとう!)
iOS 6.0以降、をUITableViewDelegate
持っていtableView:shouldHighlightRowAtIndexPath:
ます。(iOSのドキュメントでそれについて読んでください。)
このメソッドを使用すると、セルの選択スタイルを変更したり、を使用してセルのイベント処理を変更userInteractionEnabled = NO
したり、ここに記載されているその他の手法を使用したりすることなく、特定の行を強調表示不可能(および暗黙的に選択不可能)としてマークできます。
以下の画像に示すように、インスペクターペインで(UITableViewプロパティの)オプションNoSelection
から選択することにより、インターフェイスビルダー自体から行の選択を無効にすることもselection
できます。
選択をフラッシュするだけで、選択した状態のままにしたくない場合は、
didSelectRowAtIndexPath
以下
[tableView deselectRowAtIndexPath:indexPath animated:YES];
そのため、選択した状態が点滅して元に戻ります。
UITableViewDelegate
プロトコルから、メソッドwillSelectRowAtIndexPath
を使用できreturn nil
、行を選択したくない場合は使用できます。
同じ方法で、willDeselectRowAtIndexPath
メソッドを使用できますreturn nil
。行を選択解除したくない場合も同様です。
1-次のいずれかを使用して、UITableViewCell
インスタンスに選択スタイルを設定するだけです。
Objective-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
または
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
スウィフト2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
スウィフト3:
cell.selectionStyle = .none
2-実装しない- tableView:didSelectRowAtIndexPath:
テーブルビューでdelegate
実装するか、実装する場合にアクションを実行しないセルを明示的に除外します。
3-さらに、ストーリーボードからも実行できます。テーブルビューセルをクリックし、[テーブルビューセル]の下の属性インスペクターで、[選択]の横のドロップダウンを[なし]に変更します。
4-(iOS)Xcode 9、Swift 4.0の以下のコードを使用して、テーブルセルのハイライトを無効にできます
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
以下のスニペットは強調表示を無効にしますが、への呼び出しも無効にしますdidSelectRowAtIndexPath
。したがって、実装していない場合はdidSelectRowAtIndexPath
、以下の方法を使用してください。これは、テーブルを作成するときに追加する必要があります。これはボタンとUITextField
セル内でも機能します。
self.tableView.allowsSelection = NO;
以下のスニペットは強調表示を無効にし、への呼び出しを無効にしませんdidSelectRowAtIndexPath
。セルの選択スタイルをなしに設定しますcellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
以下のスニペットは、セルのすべてを無効にします。これはへの相互作用を無効にしますbuttons
、textfields
:
self.tableView.userInteractionEnabled = false;
以下はSwift
上記のObjective-C
ソリューションと同等です。
最初のソリューションの置き換え
self.tableView.allowsSelection = false
2番目のソリューションの置き換え
cell?.selectionStyle = UITableViewCellSelectionStyle.None
3番目のソリューションの置き換え
self.tableView.userInteractionEnabled = false
入力してみてください:
cell.selected = NO;
必要に応じて行の選択を解除します。
Swift3では...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let r = indexPath.row
print("clicked .. \(r)")
tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}
私もこれとかなり戦っており、UITableViewCell
禁止されているuserInteractionEnabled
財産の使用を管理しています。設定用に3セルの静的テーブルがあり、2つが日付、1つがオン/オフスイッチです。Storyboard / IBで遊んだ後、一番下の1つを選択不可にできましたが、それをタップすると、一番上の行の1つからの選択が消えます。これは私の設定UITableViewのWIP画像です:
3行目をタップしても何も起こらない場合、選択範囲は2行目に留まります。この機能は、実質的にはAppleのカレンダーアプリのイベント追加時間選択画面のコピーです。
コードは驚くほど互換性があり、IOS2に至るまで= /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
これは選択スタイルをnoneに設定することと連動して機能するため、タッチダウンイベントでセルがちらつきません
これは、選択中に行がハイライトを表示しないようにするための最良かつ最も簡単なソリューションですが
cell.selectionStyle = UITableViewCellSelectionStyleNone;
また、行が選択されていることを簡単に示してからオフにすると便利な場合があることもお勧めします。これは、ユーザーが何を選択するつもりかを確認することでユーザーに警告します。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
またUITableViewCellSelectionStyleNone
、を使用したくない/使用できない場合に備えて、と同じ効果を得るために背景色をClearに設定することもできますUITableViewCellSelectionStyleNone
。
次のようなコードを使用します。
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
これが可能劣化し、あなたが追加するなど、あなたのパフォーマンスを余分に色付きビューの各セルを。
これを使えます
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
selection
、もちろんそれによって無効になりhighlighting
ます。投票数の多い回答の多くdisable selection
は、無効化に対処する方法と対処しないことを説明していますhighlighting
。強調表示のみを無効にするにはcell.selectionStyle = .None
、次の場所に移動するか、移動しますstoryboard / cell / Selection = None