UITableViewの選択を無効にするにはどうすればよいですか?


1193

の行をタップするとUITableView、その行が強調表示されて選択されます。これを無効にして、行をタップしても何も起こらないようにすることはできますか?


17
元の質問のタイトルが不適切です。OPは主に無効にすることを望んでいますがselection、もちろんそれによって無効になりhighlightingます。投票数の多い回答の多くdisable selectionは、無効化に対処する方法と対処しないことを説明していますhighlighting。強調表示のみを無効にするにはcell.selectionStyle = .None、次の場所に移動するか、移動しますstoryboard / cell / Selection = None
Andrej

タイトルまたは投稿を更新してください。よくわかりません。そして、この質問に基づいて、私は提供された答えが何をすることを意味しているのか分かりません。
Daniel Springer

回答:


604

私にとって、以下はうまくいきました:

tableView.allowsSelection = false

これはdidSelectRowAt#単に機能しないことを意味します。つまり、テーブルの行に触れても、まったく何も起こりません。(したがって、明らかに、選択されたアニメーションはありません。)

(セル上に、UIButtonまたはその他のコントロールがある場合、もちろんそれらのコントロールは引き続き機能します。テーブルセル上にあるコントロールはすべて、UITableViewの「行の選択」を可能にする機能とはまったく関係ありません。を使用しdidSelectRowAt#ます。)

注意すべきもう1つの点UITableViewは、が編集モードの場合は機能しません。編集モードでセルの選択を制限するには、次のコードを使用します。

tableView.allowsSelectionDuringEditing = false 

6
これは最終的に私のために働きました、私はcell.selectionStyle = UITableViewCellSelectionStyleNoneを使用しようとしました; しかし、それはうまくいきませんでした。注意すべきことの1つは次のとおりです。tableView.allowsSelection= NO; 偽ではない。
tony.tc.leung 2010年

6
これが最良の選択だと思います。セルのボタンはアクティブですが、テキストはアクティブではありません。
Fahim Parkar 2013

513
これはどのように受け入れられた回答であり、これは賛成票が多いですか?質問には一切答えません!selectionStyleセルのプロパティを設定する必要があります:cell.selectionStyle = UITableViewCellSelectionStyle.NoneSwiftまたはcell.selectionStyle = UITableViewCellSelectionStyleNoneObjective-Cで。
nodebase 2015

5
これはtableView.allowSelection = false
Swift

15
これを行うには、目的に応じていくつかの方法があります。どの選択スタイルもどの選択も機能しないか、どちらも失敗する可能性があります。ここに例があります。セルを選択してtableViewDidSelectRowAtIndexPathを呼び出す場合cell.selectionStyle = .Noneは、が必要です。そのデリゲート関数が呼び出されないようにしたい場合(つまり、tableViewCellにテキストフィールドがある場合)の設定tableView.allowsSelection = falseは問題ありません。
Made2k 2016

1964

次のUITableViewCellいずれかを使用して、インスタンスに選択スタイルを設定するだけです。

Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

または

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

スウィフト2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3および4.x:

cell.selectionStyle = .none

さらに、-tableView:didSelectRowAtIndexPath:テーブルビューデリゲートに実装しないか、実装する場合はアクションを実行しないセルを明示的に除外するようにしてください。

詳細はこちらこちら


122
@Tonyセル内にUITextFieldがあると悪い考えです。
Aniruddh Joshi

73
@TonyMillionは、スワイプして削除するなどの組み込みの編集コントロールを使用する場合にも悪い考えです。userInteractionEnabledをNOに設定すると、削除ボタンはユーザーのタッチイベントに応答しません。
Carlos P

47
このスレッドに遅れますが、userInteractionの代わりにcell.allowsSelectionを使用してください。これはセルの対話メソッドを停止しますが、通常のUIViewレスポンダーのものをブロックしません。
クリスC

4
cell.userInteractionEnable = Noを設定しても、didSelectRowAtIndexPathのトリガーは停止しません。
user4951 2012年

25
私は回答に賛成票を投じますが、明確にするために、OPは「強調表示」を無効にすることだけを求め、セル全体の相互作用を無効にしないよう求めたため、このコメントはすべてトピック外です。
Frederic YesidPeñaSánchez2014

353

私は最近この記事を読んだことがあり、それが役に立ったので、別の回答を投稿してすべての回答を統合したいと思いました(後世のため)。



したがって、実際には、必要なロジックや結果に応じて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

3
セルのデザインをペン先からロードする場合、チェックボックス(IB内)は#3(および#4のテーブル)で問題なく機能します。#4と#2の場合、セル内のコントロールがインタラクティブになるかどうかの違いはありますか?
lilbyrdie

4
はい。選択を無効にしたいがUIButtonなどを許可してユーザーの操作を引き続きサポートする場合は、#2を使用します。完全に読み取り専用のセルが必要な場合は、#4を使用します。もちろん、非インタラクティブセルにUIViewsまたはUILabels以外のものがある理由は、私を超えています。他の何かが起こっている間、誰かがすべての対話を無効にしたいと思うかもしれません。
mbm29414 2011年

8
#4はひどい考えです。これを行うと、テーブルビューでのスクロールも無効になります
simon

4
@simon実際、それはひどい考えではありません。これは、状況に応じて適切なオプションとそうでないオプションの1つです。また、#4はUSERスクロールを無効にします。必要に応じて、独自に実装することもできます。#4はあまり役に立たないが、それはひどい考えではないことに同意します。
mbm29414 2014

3
完全を期すためにtableView:shouldHighlightRowAtIndexPath:、のシャウトアウトを追加してください。これは一般的に(常にではありませんが)私の推奨するアプローチです。
ベンジョン

82

私が信じていることを要約すると、これを実装した自分の経験に基づく正しい答えです:

一部のセルのみの選択を無効にする場合は、次を使用します。

cell.userInteractionEnabled = NO;

これにより、選択が防止されるだけでなく、設定されているセルに対して呼び出されるtableView:didSelectRowAtIndexPath:も停止します。(クレジットはこの答えをトニーミリオンに送ってくれてありがとう!)

クリックする必要のあるボタンがセルにある場合は、代わりに次の操作を行う必要があります。

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

また、のセルをクリックしても無視する必要があります- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

テーブル全体の選択を無効にするには、次を使用します。

tableView.allowsSelection = NO;

(Paulo De Barrosへのクレジット、ありがとう!)


セルにボタンがある場合はどうなりますか?
Umair Afzal 2016

56

iOS 6.0以降、をUITableViewDelegate持っていtableView:shouldHighlightRowAtIndexPath:ます。(iOSのドキュメントでそれについて読んでください。)

このメソッドを使用すると、セルの選択スタイルを変更したり、を使用してセルのイベント処理を変更userInteractionEnabled = NOしたり、ここに記載されているその他の手法を使用したりすることなく、特定の行を強調表示不可能(および暗黙的に選択不可能)としてマークできます。


2
このスレッドに出くわしましたが、この質問の前に他の多くの回答を見てショックを受けました。これは間違いなく適切な方法です。
beebcon、2016年

2
これは確かに正しい、唯一考慮すべき答えです。userInteractionについて言及している他のすべては完全に正しくありません。
mattyohe

50

以下の画像に示すように、インスペクターペインで(UITableViewプロパティの)オプションNoSelectionから選択することにより、インターフェイスビルダー自体から行の選択を無効にすることもselectionできます。

UITableViewインスペクター


2
ベストソリューションIMHO
イタイスペクター

私はこのソリューションをよく使用します
Evsenev 2017年


36

あなたの中UITableViewCellXIBの属性インスペクタの設定値でSelectionNone

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


これはまさに私が必要としたものです。まだdidSelect ...通知が必要でしたが、選択の表示はありませんでした。ありがとう!
Timothy Tripp 2017年

それが役に立ててうれしい!:)
Zaid Pathan 2017年

35

選択をフラッシュするだけで、選択した状態のままにしたくない場合は、

didSelectRowAtIndexPath

以下

[tableView deselectRowAtIndexPath:indexPath animated:YES];

そのため、選択した状態が点滅して元に戻ります。


3
このアプローチでは、行が瞬時にハイライト表示され、0.5秒後にフェードアウトします。これがAppleの設定メニューのスタイルなので、私にはよく見える。
VinceFior 2015

34

誰かがSwiftに答える必要がある場合:

cell.selectionStyle = .None

1
このcell.selectionStyle = UITableViewCellSelectionStyle.Noneを使用することもできます
おそらく

29

これは私が使っているもので、cellForRowAtIndexPathこのコードを書いています:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

28

UITableViewDelegateプロトコルから、メソッドwillSelectRowAtIndexPath を使用できreturn nil、行を選択したくない場合は使用できます。

同じ方法で、willDeselectRowAtIndexPathメソッドを使用できますreturn nil。行を選択解除したくない場合も同様です。


5
この方法は、タッチアップするまでセルが強調表示された状態で表示されるため、私はこの方法が好きではありません。
kbanman 2010

2
それこそが私が気に入っている理由です:-)
Joris Weimar

24

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


}

20

Objective-C:

  1. 以下のスニペットは強調表示を無効にしますが、への呼び出しも無効にしますdidSelectRowAtIndexPath。したがって、実装していない場合はdidSelectRowAtIndexPath、以下の方法を使用してください。これは、テーブルを作成するときに追加する必要があります。これはボタンとUITextFieldセル内でも機能します。

    self.tableView.allowsSelection = NO;
  2. 以下のスニペットは強調表示を無効にし、への呼び出しを無効にしませんdidSelectRowAtIndexPath。セルの選択スタイルをなしに設定しますcellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
  3. 以下のスニペットは、セルのすべてを無効にします。これはへの相互作用を無効にしますbuttonstextfields

    self.tableView.userInteractionEnabled = false;

迅速:

以下はSwift上記のObjective-Cソリューションと同等です。

  1. 最初のソリューションの置き換え

    self.tableView.allowsSelection = false
  2. 2番目のソリューションの置き換え

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
  3. 3番目のソリューションの置き換え

    self.tableView.userInteractionEnabled = false

19

入力してみてください:

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)
}

14

私もこれとかなり戦っており、UITableViewCell禁止されているuserInteractionEnabled財産の使用を管理しています。設定用に3セルの静的テーブルがあり、2つが日付、1つがオン/オフスイッチです。Storyboard / IBで遊んだ後、一番下の1つを選択不可にできましたが、それをタップすると、一番上の行の1つからの選択が消えます。これは私の設定UITableViewのWIP画像です:

設定UITableView

3行目をタップしても何も起こらない場合、選択範囲は2行目に留まります。この機能は、実質的にはAppleのカレンダーアプリのイベント追加時間選択画面のコピーです。

コードは驚くほど互換性があり、IOS2に至るまで= /:

- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 2) {
        return nil;
    }
    return indexPath;
}

これは選択スタイルをnoneに設定することと連動して機能するため、タッチダウンイベントでセルがちらつきません


11

次のようなコードを書くことができます

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

しかし、カスタムセルxibがラインの上にある場合、そのときに警告を出します

カスタムセルxib

インターフェースビルダーから選択スタイルなし設定する必要があります


11

このコードをcellForRowAtIndexPathに挿入するだけです

セルの選択プロパティを無効にするには:(セルをタップしている間)。

cell.selectionStyle = UITableViewCellSelectionStyle.None

ありがとう、私は私のセルに画像とその上のラベルを持っています。ラベルの背景を設定しましたが、背景をクリックするたびに消えてしまうので、これで解決しました。
Darko

10

これを試して

cell.selectionStyle = UITableViewCellSelectionStyleNone;

そして

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

また、interfacebuilderを使用して選択スタイルを設定することもできます。



7

これは、選択中に行がハイライトを表示しないようにするための最良かつ最も簡単なソリューションですが

cell.selectionStyle = UITableViewCellSelectionStyleNone;

また、行が選択されていることを簡単に示してからオフにすると便利な場合があることもお勧めします。これは、ユーザーが何を選択するつもりかを確認することでユーザーに警告します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}


6

UItableviewcellの強調表示を無効にするには

cell.selectionStyle = UITableViewCellSelectionStyleNone;

また、ユーザーがセルを操作できないようにする必要があります。

cell.userInteractionEnabled = NO;

6

またUITableViewCellSelectionStyleNone、を使用したくない/使用できない場合に備えて、と同じ効果を得るために背景色をClearに設定することもできますUITableViewCellSelectionStyleNone

次のようなコードを使用します。

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

これが可能劣化し、あなたが追加するなど、あなたのパフォーマンスを余分に色付きビューの各セルを。


6

使用できます:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

UITableViewのインデックスパスメソッドの行のセル。

また、あなたは使うことができます:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

テーブルビューでdidselectrowatindexpathメソッド。


現在cell.selectionStyle = UITableViewCellSelectionStyle.noneはSwift 3にあります
Dan


5

...を使用できます。

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


5
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

ハッピーコーディング!!!


5

ストーリーボードからも実行できます。テーブルビューセルをクリックし、[テーブルビューセル]の下の属性インスペクターで、[選択]の横のドロップダウンを[なし]に変更します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.