ios - 解除 - どのように私はUITableViewの選択を無効にすることができますか?




uitableviewcellselectionstylenone (20)

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


目標-C:

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

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. 以下のスニペットでは、セルのすべてを無効にします。 buttonstextfieldsやりとりが無効になりbuttons

    self.tableView.userInteractionEnabled = false;
    

迅速:

以下は上記のObjective-CソリューションのSwift相当します。

  1. 最初の解決策の置き換え

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

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
    
  3. 第3の解決策の置き換え

    self.tableView.userInteractionEnabled = false
    

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

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

または

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

Xib / Storyboardファイルを作成した場合は、チェックを外してtableviewのsetUserInteractionEnabledプロパティをNoに変更できます。 これにより、テーブルビューが読み取り専用になります。


iOS 6.0以降、 UITableViewDelegatetableView:shouldHighlightRowAtIndexPath:ます。 (iOSのDocumentationください)

このメソッドを使用すると、セルの選択スタイルを変更することなく、セルのイベント処理をuserInteractionEnabled = NOuserInteractionEnabled = NOことなく、またはここに文書化されている他の手法を使用せずに、特定の行をハイライト不可(暗黙的に、選択不可能)としてマークすることができます。


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

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

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

これによりセルに色付きのビューを追加することで、パフォーマンスが低下する可能性があります。


SWIFT 3の固定ソリューション

cell.selectionStyle = .none

カスタムセル付きスウィフトソリューション:

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 setSelectionStyle:UITableViewCellSelectionStyleNone];

あなたはこれを使うことができます

cell.selectionStyle = UITableViewCellSelectionStyleNone;

これは私が使用しているものです:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

cellForRowAtIndexPath内にこのコードを記述します。


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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

また、行が選択されていることを簡単に示し、それをオフにすることが時折役立つことを提案したいと思います。 これは、ユーザが選択しようとしていたことの確認をユーザに警告する。

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

これを試して

cell.selectionStyle = UITableViewCellSelectionStyleNone;

そして

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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


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

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

しかし、私たちがライン上のカスタムセルxibを持っているときは、

カスタムセルxib

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


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

目標-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

または

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

スウィフト2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

スウィフト3と4.x:

cell.selectionStyle = .none

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

詳細はこちらhere


次のように入力してください:

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

私のために、以下はうまくいきました:

tableView.allowsSelection = NO;

つまり、 didSelectRowAt#は動作しません。 つまり、テーブルの行に触れることは絶対に何もしません。 (したがって、明らかに、選択されたアニメーションは存在しません。)

(セル上にUIButtonやその他のコントロールがある場合は、もちろんそれらのコントロールは引き続き機能することに注意してください)テーブルセルで発生したコントロールは、UITableViewの「行の選択」 " didSelectRowAt#を使用してdidSelectRowAt# 。)


私はこの記事を最近読んでいて、助けになったので、すべての回答をまとめる別の答えを投稿したかったです(後世のために)。


実際には、あなたの希望するロジックや結果に応じて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プロトコルメソッドを実装UITableViewDelegateます。

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

私はこれを使用しています。これは私のために働きます。

cell?.selectionStyle = UITableViewCellSelectionStyle.None

誰でもSwift答えが必要な場合:

cell.selectionStyle = .None

選択した状態を維持しないで、選択範囲を点滅させたい場合は、in、

didSelectRowAtIndexPath

以下

[tableView deselectRowAtIndexPath:indexPath animated:YES];

選択した状態を点滅させて元に戻します。


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

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





cocoa-touch