UITableView
の行をタップすると、その行が強調表示されて選択されます。行をタップしても何も起こらないようにこれを無効にすることは可能ですか?
私にとっては、以下がうまくいった:
tableView.allowsSelection = NO;
これはdidSelectRowAt#
が単に機能しないことを意味します。つまり、テーブルの行に触れても、まったく何もしません。 (そしてそれゆえ、明らかに、選択されたアニメーションは決して存在しないでしょう。)
(セルにUIButton
などのコントロールがある場合、それらのコントロールはもちろん機能します。テーブルセルにあるコントロールは、UITableViewの行の選択を許可する機能とはまったく関係ありません。 "didSelectRowAt#
を使用しています。)
あなたがしなければならないのは、以下のいずれかを使用してUITableViewCell
インスタンスに選択スタイルを設定することです。
目的C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
または
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
スイフト2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3と4.x:
cell.selectionStyle = .none
さらに、テーブルビューデリゲートに-tableView:didSelectRowAtIndexPath:
を実装しないこと、または実装した場合にアクションを実行したくないセルを明示的に除外しないことを確認してください。
私は最近この記事を読み、それが私を助けてくれたので、私は(後世のために)すべての答えをまとめるために別の答えを投稿したいと思いました。
だから、実際にあなたの希望する論理や結果に応じて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
私がこれを実行する際の私自身の経験に基づく正しい答えであると私が信じているものをまとめると:
一部のセルだけの選択を無効にしたい場合は、次のようにします。
cell.userInteractionEnabled = NO;
選択を妨げるだけでなく、これによってtableView:didSelectRowAtIndexPath:が設定されているセルに対して呼び出されなくなります。 (この答えはTony Millionにおまかせください、ありがとう!)
クリックする必要があるボタンがセルにある場合は、代わりに次の操作を行う必要があります。
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
また、- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
のセルをクリックしても無視する必要があります。
テーブル全体の選択を無効にしたい場合は、次のようにします。
tableView.allowsSelection = NO;
(Paulo De Barrosへの謝辞、ありがとう!)
IOS 6.0以降、UITableViewDelegate
はtableView:shouldHighlightRowAtIndexPath:
を持ちます。 (それについてはiOS Documentation で読んでください。)
このメソッドを使用すると、セルの選択スタイルを変更したり、セルのuserInteractionEnabled = NO
によるイベント処理や、ここに記載されている他の方法を使用したりすることなく、特定の行をハイライト不可(そして暗黙的に選択不可)にできます。
下の図に示すように、インスペクタペインで(UITableViewプロパティの)NoSelection
オプションからselection
を選択して、インタフェースビルダー自体からの行の選択を無効にすることもできます。
Swift 3用の解決策 /
cell.selectionStyle = .none
誰かが Swift に答えを必要とする場合
cell.selectionStyle = .None
選択範囲をフラッシュのみで、選択状態のままにしたくない場合は、次のように呼び出します。
didSelectRowAtIndexPath
以下
[tableView deselectRowAtIndexPath:indexPath animated:YES];
そのため、選択した状態が点滅して元に戻ります。
これは私が使っているもので、cellForRowAtIndexPath
に次のコードを書いてください。
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewDelegate
プロトコルから、行を選択したくない場合はwillSelectRowAtIndexPath
およびreturn nil
メソッドを使用できます。
同様に、行の選択を解除したくない場合はwillDeselectRowAtIndexPath
メソッドとreturn nil
を使用できます。
以下のスニペットは強調表示を無効にしますが、didSelectRowAtIndexPath
の呼び出しも無効にします。 didSelectRowAtIndexPath
を実装していないのであれば、以下のメソッドを使用してください。テーブルを作成するときにこれを追加する必要があります。これはセル内のボタンとUITextField
でも動作します。
self.tableView.allowsSelection = NO;
以下のスニペットは強調表示を無効にし、didSelectRowAtIndexPath
への呼び出しを無効にしません。 cellForRowAtIndexPath
でセルの選択スタイルをNoneに設定します
cell.selectionStyle = UITableViewCellSelectionStyleNone;
下のスニペットはセルのすべてを無効にします。これはbuttons
、textfields
への対話を無効にします。
self.tableView.userInteractionEnabled = false;
以下は、上記のObjective-C
ソリューションと同等のSwift
です。
最初のソリューションの交換
self.tableView.allowsSelection = false
第2解決の取り替え
cell?.selectionStyle = UITableViewCellSelectionStyle.None
第3解決の取り替え
self.tableView.userInteractionEnabled = false
入力してみてください:
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)
}
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
}
私はUITableViewCell
にコントロールを持つことでuserInteractionEnabled
プロパティの使用を禁止していました。設定用に3セルの静的テーブルがあり、2つは日付、1つはオン/オフスイッチです。 Storyboard/IBで遊んだ後、一番下のものを選択できないようにしましたが、それをタップすると上の行の1つからの選択が消えます。これは私の設定UITableViewのWIP画像です。
3行目をタップしても何も起こらない場合、選択は2行目に留まります。機能は事実上Appleのカレンダーアプリの追加イベント時間選択画面のコピーです。
このコードは驚くほど互換性があり、IOS2 = /まで完全に互換性があります。
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
これは、選択スタイルをnoneに設定することと連携して機能するため、タッチダウンイベントでセルがちらつくことはありません。
このコードをcellForRowAtIndexPathに入れるだけです。
セルの選択プロパティを無効にするには:(セルをタップしている間)。
cell.selectionStyle = UITableViewCellSelectionStyle.None
次のようにコードを書くことができます
cell.selectionStyle = UITableViewCellSelectionStyleNone;
しかし、 カスタムセルxib の上の行 に警告を出します その時点で/
カスタムセルxib
インタフェースビルダーから選択スタイルなしを設定する必要があります
私はこれを使っています。
cell?.selectionStyle = UITableViewCellSelectionStyle.None
これを試して
cell.selectionStyle = UITableViewCellSelectionStyleNone;
そして
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
また、interfacebuilderを使って選択スタイルを設定することもできます。
これは選択中に行がハイライトを表示しないようにするための最善かつ最も簡単な解決策ですが
cell.selectionStyle = UITableViewCellSelectionStyleNone;
行が選択されていることを簡単に示してからオフにすると便利な場合があることをお勧めします。これにより、選択した内容の確認がユーザーに通知されます。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
UItableviewcellの強調表示を無効にする
cell.selectionStyle = UITableViewCellSelectionStyleNone;
そして、ユーザーがセルと対話することを許可しないでください。
cell.userInteractionEnabled = NO;
UITableViewCellSelectionStyleNone
を使用したくない/使用できない場合に、UITableViewCellSelectionStyleNone
と同じ効果を得るために、背景色をClearに設定することもできます。
次のようなコードを使用します。
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
これはdegradeextra色付きのビューから各セル。
あなたが使用することができます:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
uITableViewのインデックスパスメソッドの行のセルに。
また、使用することができます:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
表形式ではelectrowatindexpathメソッドを使用しました。
UITableViewCellの selectionStyle プロパティを使用できます。
cell.selectionStyle = UITableViewCellSelectionStyleNone;
または
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
また、以下のデリゲートを実装しないでください
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }
Xib/Storyboardファイルを作成した場合は、それをオフにすることで setUserInteractionEnabled tableviewのプロパティを いいえ に変更できます。これにより、テーブルビューは読み取り専用になります。
最善の解決策は 選択スタイルをなしにする
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
ただし、ここでは、選択された状態に使用されるカスタムイメージがないことを考慮しています。
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
ハッピーコーディング!
cell.selectionStyle = UITableViewCellSelectionStyleNone;
あなたが使用することができます....
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
カスタムセル付きの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
}
}
これが使えます
cell.selectionStyle = UITableViewCellSelectionStyleNone;
ストーリーボードからもできます。テーブルビューセルをクリックし、テーブルビューセルの下の属性インスペクタで、「選択」の横にあるドロップダウンを「なし」に変更します。
より良いアプローチは次のとおりです。
cell.userInteractionEnabled = NO;
このアプローチはdidSelectRowAtIndexPath:
メソッドを呼び出しません。
少なくともiOS 6以降、カスタムセルのメソッドをオーバーライドして青いハイライトを防ぐことができます。他の対話が無効になったり影響を受けたりすることはありません。 3つすべてを上書きする必要があります。
- (void) setHighlighted:(BOOL)highlighted
{
}
- (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
}
- (void) setSelected:(BOOL)selected animated:(BOOL)animated
{
}
(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
}
非常にシンプルなもの。テーブルビューセルを返す前に、テーブルビューセルのスタイルプロパティを使用します。
テーブルビューセルを返す前に、次のコード行を書くだけですcell.selectionStyle = .none
シナリオ-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