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]];
}
ありがとう。
このコードを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;
を設定して項目をグレーアウトすることもできます。
行(または行のサブセット)を選択不可にする場合は、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;
}
IOS 6以降では、あなたが使用することができます
-tableView:shouldHighLightRowAtIndexPath:
NO
を返すと、選択の強調表示とそのセルに接続されているストーリーボードで起動されたセグエの両方が無効になります。
このメソッドは、タッチが連続して落ちたときに呼び出されます。そのメッセージにNO
を返しても選択プロセスは停止し、現在選択されている行は、タッチが押されている間は選択された外観を失いません。
上記の答えのどれも本当に問題を正しく解決しません。その理由は、セルの選択を無効にしたいのですが、必ずしもセル内のサブビューの選択を無効にしたいからです。
私の場合、行の真ん中に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セントです。私は多くの人がこれが役に立つと確信しています。
これらのデータソースメソッドで選択をトラップします。
– tableView:willSelectRowAtIndexPath:
– tableView:didSelectRowAtIndexPath:
– tableView:willDeselectRowAtIndexPath:
– tableView:didDeselectRowAtIndexPath:
これらのメソッドでは、選択した行が選択可能になりたい行であるかどうかを確認します。そうであれば、行動を起こし、そうでなければ何もしない。
残念ながら、1つのセクションだけで選択をオフにすることはできません。それはテーブル全体か何もないです。
ただし、テーブルセルのselectionStyle
プロパティをUITableViewCellSelectionStyleNone
に設定することはできます。選択が見えなくなると思います。上記の方法と組み合わせると、セルはユーザーの観点からは完全に不活性になります。
一部の行だけが選択可能なテーブルがある場合は、選択可能な行のセルが選択不可能な行と視覚的に異なることが重要です。シェブロンアクセサリーボタンはこれを行うためのデフォルトの方法です。
しかし、そうしても、ユーザーが行を選択しようとしても、その行が何もしないためにアプリケーションが不正なものになっているとは思わないでください。
例えばSwift 4.の場合:
cell.isUserInteractionEnabled = false
cell.contentView.alpha = 0.5
cellForRowAtIndexPath
メソッド内でセル選択を無効にするには、次のようなことをする必要があります。
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[cell setUserInteractionEnabled:NO];
セルがグレー表示されるようにするには、tableView:WillDisplayCell:forRowAtIndexPath
メソッド内に次のコードを追加します。
[cell setAlpha:0.5];
1つの方法では対話性を制御でき、もう1つの方法ではUIの外観を制御できます。
データモデルに基づく私の解決策:
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
}
いくつかのセルだけが選択されているのを止めるには:
cell.userInteractionEnabled = NO;
選択を妨げるだけでなく、これによってtableView:didSelectRowAtIndexPath:が設定されているセルに対して呼び出されなくなります。
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番目のセクションの最初の行だけを選択できます。残りのすべての行は選択できません。ありがとう!
Swift 4.0の場合これでうまくいきます。 didSelectRowAtIndexPathメソッドでCellを無効にしますが、サブビューはクリック可能なままにします。
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
if (indexPath.row == clickableIndex ) {
return indexPath
}else{
return nil
}
}
Swiftの場合:
cell.selectionStyle = .None
cell.userInteractionEnabled = false
単純
ナビゲートできる場合はセルにcell.userInteractionEnabled = YES;
を、それ以外の場合はcell.userInteractionEnabled = NO;
を使用するだけです。
静的テーブルと動的テーブルの両方で機能するので、これは便利です。選択を許可したいセルにのみ開示区分を設定します。
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) {
return nil;
}
return indexPath;
}
これを使用して、セルをのように見える無効にして選択不可能にすることができます。
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
}
私は上記の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;
}
コーディングせずにXcode 7では、単に次の操作を実行できます。
アウトラインビューで、[テーブルビューセル]を選択します。 (セルは、Table View Controllerのシーン> Table View Controller> Table Viewの下にネストされています。Table Viewセルを表示するには、これらのオブジェクトを公開する必要があります。)
「属性」インスペクタで、「選択」というラベルの付いたフィールドを見つけて、「なし」を選択します。 属性インスペクタ このオプションを使用すると、セルをタップしてもハイライト表示されません。
テーブルのデータソースにメソッド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:
が呼び出されないことです。
Xcode 6.3の場合:
cell.selectionStyle = UITableViewCellSelectionStyle.None;
ブライアンの答えに同意する
私が行った場合
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
}