Ketika Anda mengetuk baris dalam UITableView, baris disorot dan dipilih. Apakah mungkin untuk menonaktifkan ini sehingga mengetuk baris tidak menghasilkan apa-apa?
Ketika Anda mengetuk baris dalam UITableView, baris disorot dan dipilih. Apakah mungkin untuk menonaktifkan ini sehingga mengetuk baris tidak menghasilkan apa-apa?
Jawaban:
Bagi saya, berikut ini berfungsi dengan baik:
tableView.allowsSelection = false
Ini berarti didSelectRowAt#tidak akan berfungsi. Artinya, menyentuh deretan meja, dengan demikian, tidak akan melakukan apa pun. (Dan karenanya, jelas, tidak akan pernah ada animasi yang dipilih.)
(Perhatikan bahwa jika, pada sel, Anda memiliki UIButtonatau kontrol lain, tentu saja kontrol tersebut akan tetap berfungsi. Kontrol apa pun yang Anda miliki di sel tabel, sama sekali tidak terkait dengan kemampuan UITableView untuk memungkinkan Anda "memilih satu baris" menggunakan didSelectRowAt#.)
Hal lain yang perlu diperhatikan adalah: Ini tidak berfungsi ketika UITableViewsedang dalam mode pengeditan. Untuk membatasi pemilihan sel dalam mode pengeditan, gunakan kode seperti di bawah ini:
tableView.allowsSelectionDuringEditing = false
selectionStyleproperti di sel: cell.selectionStyle = UITableViewCellSelectionStyle.Nonedi Swift, atau cell.selectionStyle = UITableViewCellSelectionStyleNonedi Objective-C.
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPathmemanggilnya, cell.selectionStyle = .Nonediinginkan. Jika Anda tidak ingin atau peduli dengan fungsi delegasi yang dipanggil (yaitu memiliki textfield di tableViewCell) pengaturan tableView.allowsSelection = falsebaik-baik saja.
Yang harus Anda lakukan adalah mengatur gaya seleksi pada UITableViewCellinstance menggunakan salah satu:
Tujuan-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
atau
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 dan 4.x:
cell.selectionStyle = .none
Lebih jauh, pastikan Anda tidak menerapkan -tableView:didSelectRowAtIndexPath:dalam delegasi tampilan tabel Anda atau secara eksplisit mengecualikan sel yang ingin Anda tidak memiliki tindakan jika Anda menerapkannya.
Karena saya telah membaca posting ini baru-baru ini dan itu telah membantu saya, saya ingin memposting jawaban lain untuk menggabungkan semua jawaban (untuk anak cucu).
Jadi, sebenarnya ada 5 jawaban berbeda tergantung pada logika dan / atau hasil yang Anda inginkan:
1. Untuk menonaktifkan penyorotan biru tanpa mengubah interaksi sel lainnya:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Saya menggunakan ini ketika saya memiliki UIButton - atau beberapa kontrol lainnya - dihosting di UITableViewCell dan saya ingin pengguna dapat berinteraksi dengan kontrol tetapi tidak dengan sel itu sendiri.
CATATAN : Seperti yang dicatat oleh Tony Million di atas, ini TIDAK mencegahtableView:didSelectRowAtIndexPath:. Saya menyiasatinya dengan pernyataan "jika" sederhana, paling sering menguji bagian tersebut dan menghindari tindakan untuk bagian tertentu.
Cara lain yang saya pikirkan untuk menguji ketukan sel seperti ini adalah:
- (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.Untuk melakukan ini untuk seluruh tabel, Anda dapat menerapkan solusi di atas untuk setiap sel dalam tabel, tetapi Anda juga dapat melakukan ini:
[tableView setAllowsSelection:NO];
Dalam pengujian saya, ini masih memungkinkan kontrol di dalam UITableViewCellmenjadi interaktif.
3.Untuk membuat sel "read-only", Anda cukup melakukan ini:
[cell setUserInteractionEnabled:NO];
4.Untuk membuat seluruh tabel "hanya-baca"
[tableView setUserInteractionEnabled:NO];
5.Untuk menentukan dengan segera apakah akan menyorot sel (yang menurut jawaban ini secara tersirat mencakup seleksi), Anda dapat menerapkan UITableViewDelegatemetode protokol berikut :
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
tableView:shouldHighlightRowAtIndexPath:, yang umumnya (tidak selalu) pendekatan pilihan saya.
Singkatnya, apa yang saya yakini adalah jawaban yang benar berdasarkan pengalaman saya sendiri dalam mengimplementasikan ini:
Jika Anda ingin menonaktifkan seleksi untuk beberapa sel saja, gunakan:
cell.userInteractionEnabled = NO;
Selain mencegah seleksi, ini juga menghentikan tableView: didSelectRowAtIndexPath: dipanggil untuk sel yang telah disetel. (Penghargaan untuk Tony Million untuk jawaban ini, terima kasih!)
Jika Anda memiliki tombol di sel yang perlu diklik, Anda harus:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
dan Anda juga harus mengabaikan klik apa pun di sel - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.
Jika Anda ingin menonaktifkan pilihan untuk seluruh tabel, gunakan:
tableView.allowsSelection = NO;
(Penghargaan untuk Paulo De Barros, terima kasih!)
Pada iOS 6.0, UITableViewDelegatetelah tableView:shouldHighlightRowAtIndexPath:. (Baca tentang itu di Dokumentasi iOS .)
Metode ini memungkinkan Anda menandai baris tertentu sebagai tidak dapat disorot (dan secara implisit, tidak dapat dipilih) tanpa harus mengubah gaya pemilihan sel, mengacaukan penanganan acara sel dengan userInteractionEnabled = NO, atau teknik lain yang didokumentasikan di sini.
Anda juga dapat menonaktifkan pemilihan baris dari pembuat antarmuka itu sendiri dengan memilih NoSelectiondari selectionopsi (Properti UITableView) di panel inspektur seperti yang ditunjukkan pada gambar di bawah ini

SOLUSI TETAP UNTUK SWIFT 3
cell.selectionStyle = .none
Jika Anda ingin pilihan hanya flash, tidak tetap dalam kondisi yang dipilih, Anda dapat memanggil, masuk
didSelectRowAtIndexPath
pengikut
[tableView deselectRowAtIndexPath:indexPath animated:YES];
sehingga akan mem-flash status yang dipilih dan kembali.
Inilah yang saya gunakan, dalam cellForRowAtIndexPathmenulis kode ini .:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Dari UITableViewDelegateProtokol Anda dapat menggunakan metode willSelectRowAtIndexPath
dan return niljika Anda tidak ingin baris dipilih.
Dengan cara yang sama Anda dapat menggunakan willDeselectRowAtIndexPathmetode ini dan return niljika Anda tidak ingin barisnya dibatalkan.
1- Yang harus Anda lakukan adalah mengatur gaya seleksi padaUITableViewCell instance menggunakan salah satu:
Tujuan-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
atau
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3:
cell.selectionStyle = .none
2 - Jangan menerapkan - tableView:didSelectRowAtIndexPath:dalam tampilan tabel Anda delegateatau secara eksplisit mengecualikan sel yang ingin Anda tidak memiliki tindakan jika Anda menerapkannya.
3 - Selanjutnya, Anda juga dapat melakukannya dari storyboard. Klik sel tampilan tabel dan di inspektur atribut di bawah Table View Cell, ubah drop down di sebelah Selection menjadi None.
4 - Anda dapat menonaktifkan sorotan sel tabel menggunakan kode di bawah ini di (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
}
Di bawah cuplikan nonaktifkan penyorotan tetapi juga menonaktifkan panggilan ke didSelectRowAtIndexPath. Jadi jika Anda tidak menerapkan didSelectRowAtIndexPathmaka gunakan metode di bawah ini. Ini harus ditambahkan ketika Anda membuat tabel. Ini akan bekerja pada tombol dan UITextFielddi dalam sel.
self.tableView.allowsSelection = NO;Di bawah cuplikan penonaktifan penonaktifan dan tidak menonaktifkan panggilan ke didSelectRowAtIndexPath. Setel gaya pemilihan sel ke Tidak ada dicellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;Cuplikan di bawah ini menonaktifkan semua yang ada di sel. Ini akan menonaktifkan interaksi untuk buttons, textfields:
self.tableView.userInteractionEnabled = false;Di bawah ini adalah Swiftsetara dengan Objective-Csolusi di atas :
Penggantian Solusi Pertama
self.tableView.allowsSelection = falsePenggantian Solusi Kedua
cell?.selectionStyle = UITableViewCellSelectionStyle.NonePenggantian Solusi Ketiga
self.tableView.userInteractionEnabled = falseCoba ketik:
cell.selected = NO;
Ini akan membatalkan pilihan baris Anda saat dibutuhkan.
Di Swift3 ...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let r = indexPath.row
print("clicked .. \(r)")
tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}
Saya telah berjuang dengan ini cukup banyak juga, memiliki kontrol dalam UITableViewCellmelarang penggunaan userInteractionEnabledproperti. Saya memiliki tabel statis 3 sel untuk pengaturan, 2 dengan tanggal, 1 dengan sakelar hidup / mati. Setelah bermain-main di Storyboard / IB saya sudah berhasil membuat bagian bawah tidak dapat dipilih, tetapi ketika Anda mengetuknya pilihan dari salah satu baris atas menghilang. Ini adalah gambar WIP dari pengaturan saya UITableView:

Jika Anda mengetuk baris 3 tidak terjadi apa-apa, pilihan akan tetap di baris kedua. Fungsionalitas ini secara praktis merupakan salinan dari layar pemilihan waktu tambahan acara aplikasi Apple.
Kode ini secara mengejutkan kompatibel, hingga iOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
Ini bekerja bersamaan dengan mengatur gaya pemilihan ke tidak ada, sehingga sel tidak berkedip pada acara touch down
Anda hanya perlu memasukkan kode ini ke cellForRowAtIndexPath
Untuk menonaktifkan properti pemilihan sel: (Sambil mengetuk sel).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Saya menggunakan ini, yang bekerja untuk saya.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Meskipun ini adalah solusi terbaik dan termudah untuk mencegah baris dari menampilkan highlight selama pemilihan
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Saya juga ingin menyarankan bahwa kadang-kadang berguna untuk menunjukkan secara singkat bahwa baris telah dipilih dan kemudian mematikannya. Ini memperingatkan pengguna dengan konfirmasi apa yang ingin mereka pilih:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Anda juga dapat mengatur warna latar belakang ke Bersihkan untuk mencapai efek yang sama seperti UITableViewCellSelectionStyleNone, jika Anda tidak ingin / tidak bisa menggunakan UITableViewCellSelectionStyleNone.
Anda akan menggunakan kode seperti berikut:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Ini dapat menurunkan kinerja Anda saat Anda menambahkan tampilan berwarna ekstra untuk setiap sel.
Kamu bisa menggunakan :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
di sel untuk baris di metode jalur indeks UITableView Anda.
Anda juga dapat menggunakan:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
dalam tableview didselectrowatindexpath metode
cell.selectionStyle = UITableViewCellSelectionStyle.nonedalam Swift 3.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Selamat coding !!!
selection, dan tentu sajahighlightingdinonaktifkan dengan itu. Banyak jawaban pilihan menjelaskan bagaimanadisable selectiondan tidak mengatasi penonaktifanhighlighting. Untuk menonaktifkan hanya menyoroti gunakancell.selectionStyle = .Noneatau pergi kestoryboard / cell / Selection = None