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 UIButton
atau 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 UITableView
sedang dalam mode pengeditan. Untuk membatasi pemilihan sel dalam mode pengeditan, gunakan kode seperti di bawah ini:
tableView.allowsSelectionDuringEditing = false
selectionStyle
properti di sel: cell.selectionStyle = UITableViewCellSelectionStyle.None
di Swift, atau cell.selectionStyle = UITableViewCellSelectionStyleNone
di Objective-C.
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
memanggilnya, cell.selectionStyle = .None
diinginkan. Jika Anda tidak ingin atau peduli dengan fungsi delegasi yang dipanggil (yaitu memiliki textfield di tableViewCell) pengaturan tableView.allowsSelection = false
baik-baik saja.
Yang harus Anda lakukan adalah mengatur gaya seleksi pada UITableViewCell
instance 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 UITableViewCell
menjadi 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 UITableViewDelegate
metode 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, UITableViewDelegate
telah 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 NoSelection
dari selection
opsi (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 cellForRowAtIndexPath
menulis kode ini .:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Dari UITableViewDelegate
Protokol Anda dapat menggunakan metode willSelectRowAtIndexPath
dan return nil
jika Anda tidak ingin baris dipilih.
Dengan cara yang sama Anda dapat menggunakan willDeselectRowAtIndexPath
metode ini dan return nil
jika 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 delegate
atau 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 didSelectRowAtIndexPath
maka gunakan metode di bawah ini. Ini harus ditambahkan ketika Anda membuat tabel. Ini akan bekerja pada tombol dan UITextField
di 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 Swift
setara dengan Objective-C
solusi di atas :
Penggantian Solusi Pertama
self.tableView.allowsSelection = false
Penggantian Solusi Kedua
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Penggantian Solusi Ketiga
self.tableView.userInteractionEnabled = false
Coba 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 UITableViewCell
melarang penggunaan userInteractionEnabled
properti. 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.none
dalam 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 sajahighlighting
dinonaktifkan dengan itu. Banyak jawaban pilihan menjelaskan bagaimanadisable selection
dan tidak mengatasi penonaktifanhighlighting
. Untuk menonaktifkan hanya menyoroti gunakancell.selectionStyle = .None
atau pergi kestoryboard / cell / Selection = None