web-dev-qa-db-ja.com

UITableViewの選択を無効にする方法

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

1149
DavidM

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

tableView.allowsSelection = NO;

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

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

548
Paulo De Barros

あなたがしなければならないのは、以下のいずれかを使用してUITableViewCellインスタンスに選択スタイルを設定することです。

目的C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

または

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

スイフト2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3と4.x:

cell.selectionStyle = .none

さらに、テーブルビューデリゲートに-tableView:didSelectRowAtIndexPath:を実装しないこと、または実装した場合にアクションを実行したくないセルを明示的に除外しないことを確認してください。

詳細はこちら および ここ

1911
Martin Gordon

私は最近この記事を読み、それが私を助けてくれたので、私は(後世のために)すべての答えをまとめるために別の答えを投稿したいと思いました。



だから、実際にあなたの希望する論理や結果に応じて5つの異なる答えがあります。

1.セルの他の操作を変更せずに青い強調表示を無効にするには

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

UITableViewCellでUIButton(または他のコントロール)をホストしていて、ユーザーがセル自体ではなくコントロールと対話できるようにする場合は、これを使用します。

NOTE:Tony Millionが前述したように、これはtableView:didSelectRowAtIndexPath:を妨げません。私はこれを回避するために、単純な "if"ステートメントを使用しています。ほとんどの場合、セクションをテストし、特定のセクションに対するアクションを回避します。

このようなセルのタップをテストするために考えたもう1つの方法は、次のとおりです。

- (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];



[ この答え に応じて/暗黙的に選択を含む]セルを強調表示するかどうかをオンザフライで決定するには、以下のUITableViewDelegateプロトコルメソッドを実装できます。

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
350
mbm29414

私がこれを実行する際の私自身の経験に基づく正しい答えであると私が信じているものをまとめると:

一部のセルだけの選択を無効にしたい場合は、次のようにします。

cell.userInteractionEnabled = NO;

選択を妨げるだけでなく、これによってtableView:didSelectRowAtIndexPath:が設定されているセルに対して呼び出されなくなります。 (この答えはTony Millionにおまかせください、ありがとう!)

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

テーブル全体の選択を無効にしたい場合は、次のようにします。

tableView.allowsSelection = NO;

(Paulo De Barrosへの謝辞、ありがとう!)

82
JosephH

IOS 6.0以降、UITableViewDelegatetableView:shouldHighlightRowAtIndexPath:を持ちます。 (それについてはiOS Documentation で読んでください。)

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

54
cbowns

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

UITableView Inspector

47
vignesh kumar

Swift 3用の解決策 /

cell.selectionStyle = .none
45
MANISH PATHAK

誰かが Swift に答えを必要とする場合

cell.selectionStyle = .None
34
Aks

選択範囲をフラッシュのみで、選択状態のままにしたくない場合は、次のように呼び出します。

didSelectRowAtIndexPath

以下

[tableView deselectRowAtIndexPath:indexPath animated:YES];

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

34
Chris Fox

属性インスペクタのUITableViewCell _ xib _ で、Selectionの値をNoneに設定します。

enter image description here

32
Zaid Pathan

これは私が使っているもので、cellForRowAtIndexPathに次のコードを書いてください。

cell.selectionStyle = UITableViewCellSelectionStyleNone;
29
Ahsan Ebrahim

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

同様に、行の選択を解除したくない場合はwillDeselectRowAtIndexPathメソッドとreturn nilを使用できます。

28
user41806

目的C:

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

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. 下のスニペットはセルのすべてを無効にします。これはbuttonstextfieldsへの対話を無効にします。

    self.tableView.userInteractionEnabled = false;
    

迅速:

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

  1. 最初のソリューションの交換

    self.tableView.allowsSelection = false
    
  2. 第2解決の取り替え

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
    
  3. 第3解決の取り替え

    self.tableView.userInteractionEnabled = false
    
20
Arun Gupta

入力してみてください:

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

1-あなたがしなければならないのは、以下のいずれかを使用してUITableViewCellインスタンスを設定することです。


Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

または

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None


Swift 3:

cell.selectionStyle = .none


2 - テーブルビューdelegateに-tableView:didSelectRowAtIndexPath:を実装しないでください。または、実装した場合はアクションを実行したくないセルを明示的に除外してください。

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


}
17
parvind

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

Settings UITableView

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

このコードは驚くほど互換性があり、IOS2 = /まで完全に互換性があります。

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

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

14
Yarek T

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

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

cell.selectionStyle = UITableViewCellSelectionStyle.None
11
Gaurav Patel

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

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

しかし、 カスタムセルxib の上の行 に警告を出します その時点で/

カスタムセルxib

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

11
iDhaval

私はこれを使っています。

cell?.selectionStyle = UITableViewCellSelectionStyle.None
10
priyanka gautam

これを試して

cell.selectionStyle = UITableViewCellSelectionStyleNone;

そして

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

10
v_1

これは選択中に行がハイライトを表示しないようにするための最善かつ最も簡単な解決策ですが

cell.selectionStyle = UITableViewCellSelectionStyleNone;

行が選択されていることを簡単に示してからオフにすると便利な場合があることをお勧めします。これにより、選択した内容の確認がユーザーに通知されます。

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

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

そして、ユーザーがセルと対話することを許可しないでください。

cell.userInteractionEnabled = NO;
6
Sharme

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

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

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

これはdegradeextra色付きのビューからセル​​。

6
virindh

あなたが使用することができます:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

また、使用することができます:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

表形式ではelectrowatindexpathメソッドを使用しました。

6
Annu

UITableViewCellの selectionStyle プロパティを使用できます。

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

または

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

また、以下のデリゲートを実装しないでください

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }

Xib/Storyboardファイルを作成した場合は、それをオフにすることで setUserInteractionEnabled tableviewのプロパティを いいえ に変更できます。これにより、テーブルビューは読み取り専用になります。

5

最善の解決策は 選択スタイルをなしにする

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

ただし、ここでは、選択された状態に使用されるカスタムイメージがないことを考慮しています。

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

ハッピーコーディング!

5
Rinku Sadhwani
cell.selectionStyle = UITableViewCellSelectionStyleNone;
5
iDeveloper

あなたが使用することができます....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
5
Mak083

カスタムセル付きのSwift Solution:

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
  } 
}
5
Zorayr

これが使えます

cell.selectionStyle = UITableViewCellSelectionStyleNone;
5
iEinstein

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

5
Cindy

より良いアプローチは次のとおりです。

cell.userInteractionEnabled = NO;

このアプローチはdidSelectRowAtIndexPath:メソッドを呼び出しません。

2
Aniruddh Joshi

少なくともiOS 6以降、カスタムセルのメソッドをオーバーライドして青いハイライトを防ぐことができます。他の対話が無効になったり影響を受けたりすることはありません。 3つすべてを上書きする必要があります。

- (void) setHighlighted:(BOOL)highlighted
{
}

- (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
}

- (void) setSelected:(BOOL)selected animated:(BOOL)animated
{
}
2
ashevin

(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


}
1
praful argiddi

非常にシンプルなもの。テーブルビューセルを返す前に、テーブルビューセルのスタイルプロパティを使用します。

テーブルビューセルを返す前に、次のコード行を書くだけです
cell.selectionStyle = .none

1
Muhammad Ahmad

シナリオ-1

tableviewの特定のセルを選択したくない場合は、それらのセルのcellForRow関数で選択スタイルを設定できます。

Objective-C

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Swift 4.2

cell.selectionStyle = .none

シナリオ-2

テーブルビュー全体で選択を無効にするには:

Objective-C

self.tableView.allowsSelection = false;

Swift 4.2

self.tableView.allowsSelection = false
0
varunrathi28