の行をタップするとUITableView
、その行が強調表示されて選択されます。これを無効にして、行をタップしても何も起こらないようにすることはできますか?
42 に答える
UITableViewCell
次のいずれかを使用して、インスタンスで選択スタイルを設定するだけです。
目的 C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
また
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
スウィフト 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
スウィフト 3 および 4.x:
cell.selectionStyle = .none
さらに、テーブル ビュー デリゲートに実装しないか、実装-tableView:didSelectRowAtIndexPath:
する場合はアクションを実行しないセルを明示的に除外するようにしてください。
私にとって、以下はうまくいきました:
tableView.allowsSelection = false
これはdidSelectRowAt#
単に機能しないことを意味します。つまり、テーブルの行に触れても、まったく何も起こりません。(したがって、明らかに、選択されたアニメーションは存在しません。)
(セル上に、UIButton
または他のコントロールがある場合、もちろんそれらのコントロールは引き続き機能します。テーブルセル上にあるコントロールは、「行を選択」できるUITableViewの機能とはまったく関係ありません。を使用してdidSelectRowAt#
。)
UITableView
注意すべきもう1つのポイントは、編集モードの場合は機能しません。編集モードでセルの選択を制限するには、次のコードを使用します。
tableView.allowsSelectionDuringEditing = false
最近この投稿を読んで役に立ったので、すべての回答を統合するために別の回答を投稿したいと思いました(後世のために)。
したがって、目的のロジックや結果に応じて、実際には 5 つの異なる答えがあります。
1.セルの他の相互作用を変更せずに青色の強調表示を無効にするには:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
UITableViewCell でホストされている UIButton (またはその他のコントロール) があり、ユーザーがセル自体ではなくコントロールと対話できるようにしたい場合に、これを使用します。
注: 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
これを実装した私自身の経験に基づいて、正しい答えであると私が信じていることを要約すると、
一部のセルのみの選択を無効にする場合は、次を使用します。
cell.userInteractionEnabled = NO;
これにより、選択が妨げられるだけでなく、それが設定されているセルに対して tableView:didSelectRowAtIndexPath: が呼び出されるのも停止します。(この回答についてトニーミリオンに謝意を表します、ありがとう!)
セルにクリックする必要があるボタンがある場合は、代わりに次のことを行う必要があります。
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
のセルをクリックしても無視する必要があります- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
。
テーブル全体の選択を無効にする場合は、次を使用します。
tableView.allowsSelection = NO;
(パウロ・デ・バロスの功績、ありがとう!)
iOS 6.0 の時点でUITableViewDelegate
、tableView:shouldHighlightRowAtIndexPath:
. (これについては、iOSドキュメントを参照してください。)
userInteractionEnabled = NO
このメソッドを使用すると、セルの選択スタイルを変更したり、セルのイベント処理をいじったり、ここに記載されているその他の手法を使用したりすることなく、特定の行を強調表示不可 (暗黙的に選択不可) としてマークできます。
下の画像に示すように、インスペクター ペインNoSelection
のオプション (UITableView プロパティ) から選択することで、インターフェイス ビルダー自体からの行の選択を無効にすることもできます。selection
SWIFT 3 の固定ソリューション
cell.selectionStyle = .none
Swiftの回答が必要な場合:
cell.selectionStyle = .None
選択した状態を維持せずに選択を点滅させたい場合は、次のように呼び出すことができます。
didSelectRowAtIndexPath
以下
[tableView deselectRowAtIndexPath:indexPath animated:YES];
そのため、選択した状態が点滅して元に戻ります。
これは、cellForRowAtIndexPath
このコードを書く際に使用するものです。
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewDelegate
プロトコルから、行を選択したくない場合はメソッドwillSelectRowAtIndexPath
を使用できます。return nil
同じように、このwillDeselectRowAtIndexPath
メソッドを使用できますreturn nil
。行の選択を解除したくない場合。
1- 次のいずれかを使用して、インスタンスに選択スタイルを設定するだけです。UITableViewCell
目的 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
}
目的 C:
以下のスニペットはハイライトを無効にしますが、への呼び出しも無効にします
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 で遊んだ後、一番下の行を選択できないようにしましたが、タップすると一番上の行の選択が消えます。これが私の設定 UITableView の WIP イメージです。
3 番目の行をタップしても何も起こらず、選択は 2 番目の行にとどまります。この機能は、事実上、Apple のカレンダー アプリの追加イベント時間選択画面のコピーです。
コードは驚くほど互換性があり、IOS2 に至るまで =/:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
これは、選択スタイルをなしに設定することと連動して機能するため、タッチ ダウン イベントでセルがちらつきません。
スウィフト 3、4、および 5
より良い練習、コードを書くUITableViewCell
たとえば、あなたはUITableViewCell
名前を持っていますMyCell
、awakeFromNib
ただ書くだけでself.selectionStyle = .none
完全な例:
class MyCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
self.selectionStyle = .none
}
}
次のようなコードを書くことができます
cell.selectionStyle = UITableViewCellSelectionStyleNone;
ただし、カスタムセル xibが行の上にある場合、その時点で警告が表示されます
カスタム セル xib
インターフェイスビルダーから選択スタイル Noneを設定する必要があります
これを試して
cell.selectionStyle = UITableViewCellSelectionStyleNone;
と
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
また、interfacebuilder を使用して選択スタイルを設定することもできます。
これは、選択中に行が強調表示されないようにするための最良かつ最も簡単な解決策ですが、
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];
各セルに余分な色付きのビューを追加すると、パフォーマンスが低下する可能性があります。
UItableviewcell の強調表示を無効にするには
cell.selectionStyle = UITableViewCellSelectionStyleNone;
また、ユーザーがセルを操作できないようにする必要があります。
cell.userInteractionEnabled = NO;
ストーリーボードから行うこともできます。テーブル ビュー セルをクリックし、[テーブル ビュー セル] の下の属性インスペクターで、[選択] の横にあるドロップダウンを [なし] に変更します。
使用できます:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewのインデックスパスメソッドの行のセルで。
また、次を使用できます。
[tableView deselectRowAtIndexPath:indexPath animated:NO];
テーブルビューでselectrowatindexpathメソッドを実行しました。
UITableViewCell のselectionStyleプロパティを使用できます
cell.selectionStyle = UITableViewCellSelectionStyleNone;
または
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
また、デリゲートの下に実装しないでください
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }
Xib/Storyboard ファイルを作成した場合は、tableview のsetUserInteractionEnabled プロパティのチェックを外してNoに変更できます。これにより、テーブルビューが読み取り専用になります。
あなたが使用することができます....
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
カスタムセルを使用した迅速なソリューション:
import Foundation
class CustomTableViewCell: UITableViewCell
{
required init(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
{
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.selectionStyle = UITableViewCellSelectionStyle.None
}
}
これを使用できます
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
最良の解決策は、選択スタイルなしの作成です
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
ただし、ここでは、選択状態に使用されるカスタム イメージがないことを考慮しています。
より良いアプローチは次のとおりです。
cell.userInteractionEnabled = NO;
didSelectRowAtIndexPath:
このアプローチはメソッドを呼び出しません。
少なくとも iOS 6 では、カスタム セルのメソッドをオーバーライドして、青色のハイライトを防ぐことができます。他の相互作用が無効になったり、影響を受けたりすることはありません。3 つすべてをオーバーライドする必要があります。
- (void) setHighlighted:(BOOL)highlighted
{
}
- (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
}
- (void) setSelected:(BOOL)selected animated:(BOOL)animated
{
}
シナリオ - 1
tableviewの特定のセルを選択したくない場合は、それらのセルのcellForRow関数で選択スタイルを設定できます。
Objective-C
cell.selectionStyle = UITableViewCellSelectionStyleNone;
スウィフト 4.2
cell.selectionStyle = .none
シナリオ - 2
テーブルビュー全体で選択を無効にする場合:
Objective-C
self.tableView.allowsSelection = false;
スウィフト 4.2
self.tableView.allowsSelection = false