web-dev-qa-db-ja.com

UITableview:他の行ではなく一部の行の選択を無効にする方法

XMLから解析したtableviewの内容をグループに表示しています。クリックイベントを無効にしたい(まったくクリックできないようにする必要があります)テーブルには2つのグループがあります。最初のグループだけを選択し、2番目のグループは選択しないようにします。私のチューブplayer viewの2番目のグループnavigatesの最初の行をクリックします。

特定のグループまたは行だけを選択可能にするにはどうすればよいですか。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if(indexPath.section!=0)
    if(indexPath.row==0)    

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:tubeUrl]];   
}

ありがとう。

274
Warrior

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

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

セルを選択(タップ)できるようにするには(セルをタップ)

// Default style
cell.selectionStyle = UITableViewCellSelectionStyleBlue;

// Gray style
cell.selectionStyle = UITableViewCellSelectionStyleGray;

selectionStyle = UITableViewCellSelectionStyleNone;を持つセルでも、ユーザーが触れるとUIはdidSelectRowAtIndexPathを呼び出すことになります。これを避けるためには、下記のようにして設定してください。

cell.userInteractionEnabled = NO;

代わりに。また、cell.textLabel.enabled = NO;を設定して項目をグレーアウトすることもできます。

471
Pugal

行(または行のサブセット)を選択不可にする場合は、UITableViewDelegateメソッド-tableView:willSelectRowAtIndexPath:(TechZenでも言及されています)を実装します。 indexPath選択可能であってはならない場合はnilを返し、そうでなければindexPathを返します。デフォルトの選択動作を実現するには、indexPathメソッドに渡されたdelegateを返すだけですが、別のindexPathを返すことで行選択を変更することもできます。

例:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // rows in section 0 should not be selectable
    if ( indexPath.section == 0 ) return nil;

    // first 3 rows in any section should not be selectable
    if ( indexPath.row <= 2 ) return nil;

    // By default, allow row to be selected
    return indexPath;
}
338
Brian Chapados

IOS 6以降では、あなたが使用することができます

-tableView:shouldHighLightRowAtIndexPath:

NOを返すと、選択の強調表示とそのセルに接続されているストーリーボードで起動されたセグエの両方が無効になります。

このメソッドは、タッチが連続して落ちたときに呼び出されます。そのメッセージにNOを返しても選択プロセスは停止し、現在選択されている行は、タッチが押されている間は選択された外観を失いません。

ITableViewDelegateプロトコルリファレンス

54
Keller

上記の答えのどれも本当に問題を正しく解決しません。その理由は、セルの選択を無効にしたいのですが、必ずしもセル内のサブビューの選択を無効にしたいからです。

私の場合、行の真ん中にUISwitchを表示していましたが、残りの行(空白)の選択を無効にしたいのですが、スイッチの選択は無効にしませんでした。それを行うための適切な方法は、したがってメソッドにあります

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

フォームのステートメント

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

特定のセルの選択を無効にし、同時にユーザーがスイッチを操作して適切なセレクターを使用できるようにします。だれかがユーザーの操作を無効にしている場合、これは正しくありません。

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

セルを準備するだけで、UISwitchとの対話を許可しないメソッド。

また、メソッドを使用して

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

フォームのステートメントでセルの選択を解除するには

[tableView deselectRowAtIndexPath:indexPath animated:NO];

ユーザーがセルの元のcontentViewを押している間、選択されている行がまだ表示されます。

たった2セントです。私は多くの人がこれが役に立つと確信しています。

16
MightyMouse

これらのデータソースメソッドで選択をトラップします。

– tableView:willSelectRowAtIndexPath: 
– tableView:didSelectRowAtIndexPath: 
– tableView:willDeselectRowAtIndexPath: 
– tableView:didDeselectRowAtIndexPath:

これらのメソッドでは、選択した行が選択可能になりたい行であるかどうかを確認します。そうであれば、行動を起こし、そうでなければ何もしない。

残念ながら、1つのセクションだけで選択をオフにすることはできません。それはテーブル全体か何もないです。

ただし、テーブルセルのselectionStyleプロパティをUITableViewCellSelectionStyleNoneに設定することはできます。選択が見えなくなると思います。上記の方法と組み合わせると、セルはユーザーの観点からは完全に不活性になります。

Edit01:

一部の行だけが選択可能なテーブルがある場合は、選択可能な行のセルが選択不可能な行と視覚的に異なることが重要です。シェブロンアクセサリーボタンはこれを行うためのデフォルトの方法です。

しかし、そうしても、ユーザーが行を選択しようとしても、その行が何もしないためにアプリケーションが不正なものになっているとは思わないでください。

10
TechZen

例えばSwift 4.の場合:

cell.isUserInteractionEnabled = false
cell.contentView.alpha = 0.5
9

cellForRowAtIndexPathメソッド内でセル選択を無効にするには、次のようなことをする必要があります。

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[cell setUserInteractionEnabled:NO];

セルがグレー表示されるようにするには、tableView:WillDisplayCell:forRowAtIndexPathメソッド内に次のコードを追加します。

[cell setAlpha:0.5];

1つの方法では対話性を制御でき、もう1つの方法ではUIの外観を制御できます。

9
azfar

データモデルに基づく私の解決策:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    let rowDetails = viewModel.rowDetails(forIndexPath: indexPath)
    return rowDetails.enabled ? indexPath : nil
}

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let rowDetails = viewModel.rowDetails(forIndexPath: indexPath)
    return rowDetails.enabled
}
5
SoftDesigner

いくつかのセルだけが選択されているのを止めるには:

cell.userInteractionEnabled = NO;

選択を妨げるだけでなく、これによってtableView:didSelectRowAtIndexPath:が設定されているセルに対して呼び出されなくなります。

5
JosephH

tableView:willDisplayCellメソッドを使用して、tableViewCellに対するあらゆる種類のカスタマイズを実行できます。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
     [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
     [cell setUserInteractionEnabled:NO];

     if (indexPath.section == 1 && indexPath.row == 0)
     {
         [cell setSelectionStyle:UITableViewCellSelectionStyleGray];
         [cell setUserInteractionEnabled:YES];
     }
} 

上記のコードでは、ユーザーはtableViewの2番目のセクションの最初の行だけを選択できます。残りのすべての行は選択できません。ありがとう!

4
Abdul Rahman

Swift 4.0の場合これでうまくいきます。 didSelectRowAtIndexPathメソッドでCellを無効にしますが、サブビューはクリック可能なままにします。

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
         if (indexPath.row == clickableIndex ) { 
            return indexPath
         }else{
            return nil
        }
    }
4
Nilesh

Swiftの場合:

cell.selectionStyle = .None
cell.userInteractionEnabled = false
3
Esqarrouth

単純

ナビゲートできる場合はセルにcell.userInteractionEnabled = YES;を、それ以外の場合はcell.userInteractionEnabled = NO;を使用するだけです。

1
Rick Royd Aban

静的テーブルと動的テーブルの両方で機能するので、これは便利です。選択を許可したいセルにのみ開示区分を設定します。

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) {
        return nil;
    }
    return indexPath;
}
1
Jeffery Jones

これを使用して、セルをのように見える無効にして選択不可能にすることができます。

cell.selectionStyle = UITableViewCellSelectionStyleNone;

重要:これはスタイルプロパティであり、実際にはセルを無効にするものではありません。それには、didSelectRowAtIndexPath:デリゲート実装でselectionStyleを確認する必要があります。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if(cell.selectionStyle == UITableViewCellSelectionStyleNone) {
        return;
    }

    // do your cell selection handling here
}
1
pt2ph8

私は上記のBrian Chapadosの回答が好きです。ただし、これはcellForRowAtIndexPathとそれからwillSelectRowAtIndexPathの両方にロジックが重複している可能性があることを意味します。ロジックを複製するのではなく、単にselectionStyleを確認してください。

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.selectionStyle == UITableViewCellSelectionStyleNone)
        return nil;

    else
        return indexPath;
}
1
Eric D'Souza

コーディングせずにXcode 7では、単に次の操作を実行できます。

アウトラインビューで、[テーブルビューセル]を選択します。 (セルは、Table View Controllerのシーン> Table View Controller> Table Viewの下にネストされています。Table Viewセルを表示するには、これらのオブジェクトを公開する必要があります。)

「属性」インスペクタで、「選択」というラベルの付いたフィールドを見つけて、「なし」を選択します。 属性インスペクタ このオプションを使用すると、セルをタップしてもハイライト表示されません。

1
Tung Fam

テーブルのデータソースにメソッドtableView:willSelectRowAtIndexPath:のみを実装します。パスの行を強調表示する場合は、指定されたindexPathを返します。そうでなければ、nilを返します。

私のアプリの例:

- (NSIndexPath *)tableView:(UITableView *)tableView
    willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    MySelectableObj* obj = [self objectAtPath:indexPath];
    if(obj==nil) return nil;
    return indexPath;
}

これについてのいいところは、上記のメソッドがnilを返すとshouldPerformSegueWithIdentifier:sender:が呼び出されないことです。

0
user3821934

Xcode 6.3の場合:

 cell.selectionStyle = UITableViewCellSelectionStyle.None;
0
uplearnedu.com

ブライアンの答えに同意する

私が行った場合

cell.isUserInteractionEnabled = false 

そうすれば、セル内のサブビューはユーザーと対話できなくなります。

他のサイトでは、設定

cell.selectionStyle = .none

選択色を更新しないにもかかわらずdidSelectメソッドをトリガします。

WillSelectRowAtを使用するのが私の問題を解決する方法です。例:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {

    if indexPath.section == 0{

        if indexPath.row == 0{
            return nil
        }

    }
    else if indexPath.section == 1{

        if indexPath.row == 0{
            return nil
        }

    }

    return indexPath

}
0
Reimond Hill