UITableView一部のセルを「選択不可」として設定


109

UITableViewのセルプロパティを選択不可にするにはどうすればよいですか?ユーザーがセルをタップしたときにその青い選択ボックスが表示されたくありません。


4
最近のGoogle社員注意:iOSの6と以上のようにこれを行う方法はあるtableView:shouldHighlightRowAtIndexPath:よう下回っアユシュによって注意
jemmons

回答:


151

表のセルのselectionStyleプロパティをに設定しますUITableViewCellSelectionStyleNone。これにより、強調表示されなくなりますtableView:didSelectRowAtIndexPath:。また、でそのプロパティを確認することもできます。


3
ケンドールは正しいです。セバスチャンセリスの回答に従って、didSelectRowAtIndexPathがそもそも呼び出されないようにします。ただし、強調表示を防ぐために、selectionStyleも設定する必要があります。
Daniel Dickison、2009

ええ、私はセバスチャン・セリスの答えが正しい答えであると思います、ダニエルに感謝します
LolaRun

1
静的TableViewを使用するストーリーボードファンはUITableViewCellを選択でき、属性インスペクターで選択フィールドを見つけてそれをなしに
Manuel BM

197

行が選択されないようにするには

の選択を完全に防ぐUITableViewCellには、UITableViewDelegate実装を用意してくださいtableView:willSelectRowAtIndexPath:。そのメソッドからnil、行を選択したくない場合に戻ることができます。

- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
    // Determine if row is selectable based on the NSIndexPath.

    if (rowIsSelectable) {
        return path;
    }
    return nil;
}

これにより、行が選択さtableView:didSelectRowAtIndexPath:れて呼び出されなくなります。ただし、これによって行が強調表示されるのを防ぐことはできませ

行の強調表示を防ぐには

タッチ時に行が視覚的に強調表示されないようにする場合は、セルselectionStyleがに設定されUITableViewCellSelectionStyleNoneていることを確認できます。または、次のようにUITableViewDelegate実装することもできtableView:shouldHighlightRowAtIndexPath:ます。

- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Determine if row is selectable based on the NSIndexPath.

    return rowIsSelectable;
}

1
ありがとう!まさに私が必要としたもの。
Buchannon

10
これは私の意見では受け入れられるべき答えです。それはそれをマスキングする代わりに実際に問題を修正します。
Tovi7 2012年

4
セルを強調表示した後にtableView:willSelectRowAtIndexPath:が呼び出され、ちらつきが発生することに注意してください。Appleの説明より:このメソッドは、ユーザーが行に触れて指を離すまで呼び出されません。その行はそれまで選択されませんが、タッチダウンで強調表示されます。
ダニエル

5
@simpleBobに同意します。このソリューションを使用するには、選択できない行のcell.selectionStyleをUITableViewCellSelectionStyleNoneに設定する必要もあります。それ以外の場合は粘着性に見えます。
カイルクレッグ2013年

次に、最良の答えはまだ受け入れられた答えです。とにかく呼び出されるdidSelectRowAtIndexPathので、何もしないことを選択できますwillSelectRowAtIndexPath
Matthew Quiros 2013年

16

これを使って:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5
これは選択色の表示を停止するだけで、didSelectRowAtIndexPathまだ呼び出されます。
ゼケル

これは、この質問に対するDaniel Dickisonの回答とまったく同じです。

Swift 2.2 UPDATE-cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com

11

iOS 6以降のみ。

tableView:shouldHighlightRowAtIndexPath:デリゲートにメソッドを実装でき ます。詳細はこちら:http : //developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html


3
はるかに多くの賛成票を持つ必要があります。これは正解です。セルが選択されていないように選択スタイルを変更し、セルをタップできないようにユーザー操作を無効にするか、選択時にセルの選択を解除するのはハックです。
スチュアートキャンベル

9

この問題も、すでに述べたすべてを試しました。テーブルセルを選択する際の「青いフラッシュ」をなくした最後のトリックは、次の行を追加することでした。

self.myTableView.allowsSelection = NO;

これが1行なのか、すべてが組み合わされたのかはわかりませんが、完全な結果として、青色の選択や青色のフラッシュは得られません。ハッピー!


1
この問題は、テーブルビューのすべてのセルが選択できないようにするためです。一部のセルを選択可能にしたいが、他のセルを選択不可にしたい場合、これはそれを行いません。セバスチャンのアプローチは私のために働いた。
Terry

True、allowsSelection = NOはすべてのセルの選択を無効にします。
JOM

1
このプロパティと同等のプロパティがInterface Builderにありますか?
10:17にchrish

8

セットする cell.userInteractionEnabled = NO;


待って、そのようにしてください。ちょっと。「FALSE」の小文字にし、その狂ったセミコロンを失います。それはあなたのためにそれを速くします。「FALSE」は悪で間違っていましたが、「NO」は悪で間違っています。「偽」が悪で間違っている来週まで、そのようにします。
HalR 2016年


3

Appleは、didSelectRowAtIndexPathで最初に行うべきことは行の選択を解除することであると述べています

[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];

次に、AccessoryTypeをチェックマーク、またはなしなどに変更できます。didSelectRowAtIndexPathを入力すると、行の選択を解除できます。選択する必要がない場合は、その行をチェックしないでください。

テーブルビュープログラミングガイド


1
その場合、ユーザーがセルに触れると、短時間ハイライト表示されてからハイライト表示が解除されますが、私が理解しているように、ハイライト表示を完全に停止することがポイントです。
Kuba Suder

3

もう1つの方法は、いくつかのカテゴリメソッドをに追加することUITableViewCellです。私はテーブルを構築している方法のため、セバスチャン(これも良い)の答えよりもこれが好きです。他の人の役に立つかもしれないと思いました。

- (void)setSelectable:(BOOL)enabled {
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
    [self setUserInteractionEnabled:enabled];
}

- (BOOL)isSelectable {
    BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
                     [self isUserInteractionEnabled];
    return ! disabled;
}

3

スウィフト4:
あなたは選択を防止しUITableViewDelegateを使用して強調表示することができます。shouldHighlightRowAt

:この答えは、カスタムセルは、名前の作成前提としていCustomTableViewCell
そして、あなたはカスタムセルが命名することをboolean型の内側を作成したこと:がisSelectableを

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
    if cell.isSelectable == false {
        return false
    } else {
        return true
    }
}

これは、セバスチャンセリスのobjc回答のSwiftバージョンです。


1

あなたがInterface Builderであなたのセルを設計している場合は、「チェックボックスから削除することによってこれを行うことができますが有効なユーザーの対話のために」をtableViewCell


0

選択が青く表示されないようにする別の簡単な方法があります。

青で表示したくないセルを選択します。

次に、属性インスペクター(側面のプロパティビューのルーラーアイコンの横にある盾アイコン)を選択します。

次に、「選択」フィールドを「青」から「なし」に変更します。

おそらくこれはまだ選択されていることに注意してください。UI効果を回避したい場合は、選択されたように表示されません。


0

tableView:didSelectRowAtIndexPath:の代わりにtableView:willDisplayCell:forRowAtIndexPath:を使用して、セルに初めて触れたときに表示されるフラッシュを削除します。

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

0

特定の行を選択解除するには、UITableViewデリゲートの2つのメソッドでいくつかの変更を行う必要があります。

以下の方法で

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

セルの割り当て後、以下のコードを書きます

if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;

上記のコードは、ユーザーが何らかの方法で選択しようとした場合、セルの強調表示を防ぎます。

以下のこのデリゲートメソッドで

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if(indexPath.row == someCellNumber) return;

    //for other cells write the code below...
}

書き込みを行わないと、if(indexPath.row == someCellNumber) return;行が選択されたままになり、アプリがクラッシュする可能性があります



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