Bagaimana saya bisa menonaktifkan pilihan UITableView?

1193

Ketika Anda mengetuk baris dalam UITableView, baris disorot dan dipilih. Apakah mungkin untuk menonaktifkan ini sehingga mengetuk baris tidak menghasilkan apa-apa?

DavidM
sumber
17
Pertanyaan aslinya memiliki judul yang buruk. OP ingin terutama untuk menonaktifkan selection, dan tentu saja highlightingdinonaktifkan dengan itu. Banyak jawaban pilihan menjelaskan bagaimana disable selectiondan tidak mengatasi penonaktifan highlighting. Untuk menonaktifkan hanya menyoroti gunakan cell.selectionStyle = .Noneatau pergi kestoryboard / cell / Selection = None
Andrej
Harap perbarui judul atau posnya. Saya bingung. Dan berdasarkan pertanyaan ini, saya tidak tahu apa jawaban yang diberikan untuk dilakukan.
Daniel Springer

Jawaban:

604

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 
Ayo_Buat
sumber
6
ini akhirnya berhasil untuk saya, saya mencoba menggunakan cell.selectionStyle = UITableViewCellSelectionStyleNone; tapi itu tidak berhasil. Satu hal yang perlu diperhatikan: seharusnya: tableView.allowsSelection = TIDAK; tidak salah.
tony.tc.leung
6
Saya pikir, ini pilihan terbaik. Tombol pada sel aktif dengan ini, tetapi teks tidak aktif.
Fahim Parkar
513
Bagaimana ini jawaban yang diterima dan memiliki banyak suara? Itu tidak menjawab pertanyaan sama sekali! Anda perlu mengatur selectionStyleproperti di sel: cell.selectionStyle = UITableViewCellSelectionStyle.Nonedi Swift, atau cell.selectionStyle = UITableViewCellSelectionStyleNonedi Objective-C.
nodebase
5
Ini bekerja untuk saya dengan cepat 2.tableView.allowSelection = false
Khanad
15
Ada beberapa cara untuk melakukan ini tergantung pada apa yang diinginkan. Tidak ada gaya pilihan dan tidak ada pilihan yang dapat bekerja, atau keduanya gagal. Ini sebuah contoh. Jika Anda ingin memilih sel dan 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.
Made2k
1964

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.

Info lebih lanjut di sini dan di sini

Martin Gordon
sumber
122
@ Tony Adalah ide buruk jika Anda memiliki UITextField di dalam sel.
Aniruddh Joshi
73
@TonyMillion juga merupakan ide buruk jika Anda ingin menggunakan kontrol pengeditan bawaan, seperti swipe-to-delete. Jika Anda mengatur userInteractionEnabled ke NO, maka tombol hapus tidak menanggapi peristiwa sentuhan pengguna.
Carlos P
47
terlambat ke utas ini, tetapi alih-alih dari userInteraction, gunakan cell.allowsSelection. Itu menghentikan metode interaksi sel tetapi tidak memblokir hal-hal yang biasa dilakukan responden UIView.
Chris C
4
Mengatur cell.userInteractionEnable = Tidak akan berhenti memicu didSelectRowAtIndexPath.
user4951
25
Saya akan memilih jawaban, tetapi hanya untuk menjadi jelas, OP hanya diminta untuk menonaktifkan "menyoroti", tidak untuk menonaktifkan seluruh interaksi sel, sehingga semua komentar ini offtopic.
Frederic Yesid Peña Sánchez
353

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
mbm29414
sumber
3
Jika Anda memuat desain sel dari nib, kotak centang (dalam IB) akan berfungsi dengan baik untuk # 3 (dan pada tabel untuk # 4). Untuk # 4 vs # 2, apakah perbedaannya apakah kontrol di dalam sel akan interaktif atau tidak?
lilbyrdie
4
Iya. Jika Anda ingin menonaktifkan pilihan tetapi mengizinkan UIButtons, dll ... untuk terus mendukung interaksi pengguna, gunakan # 2. Jika Anda ingin sel yang sepenuhnya baca-saja, gunakan # 4. Tentu saja, mengapa Anda akan memiliki apa pun kecuali UIViews atau UILabels dalam sel non-interaktif berada di luar jangkauan saya. Mungkin seseorang ingin menonaktifkan semua interaksi saat sesuatu yang lain sedang terjadi.
mbm29414
8
# 4 adalah ide yang buruk, melakukan ini juga akan menonaktifkan pengguliran dalam tampilan tabel
simon
4
@simon Sebenarnya, itu bukan ide yang buruk; itu salah satu opsi yang mungkin atau mungkin bukan opsi yang baik tergantung pada keadaan Anda. Juga, # 4 menonaktifkan penggulir USER; Anda masih bisa menerapkan sendiri, jika perlu. Saya setuju # 4 tidak BANYAK berguna, tapi itu bukan ide yang buruk.
mbm29414
3
Untuk kelengkapan bisa tolong tambahkan teriakan untuk tableView:shouldHighlightRowAtIndexPath:, yang umumnya (tidak selalu) pendekatan pilihan saya.
Benjohn
82

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!)

JosephH
sumber
bagaimana Jika kita memiliki tombol di sel kita?
Umair Afzal
56

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.

cbowns
sumber
2
Tersandung di utas ini dan saya terkejut melihat begitu banyak jawaban lain sebelum yang ini. Ini tanpa diragukan adalah cara yang tepat.
beebcon
2
Ini memang jawaban yang benar dan satu-satunya yang harus dipertimbangkan. Hal lain yang menyebutkan interaksi pengguna sepenuhnya salah.
mattyohe
50

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

Inspektur UITableView

vignesh kumar
sumber
2
IMHO solusi terbaik
Itai Spector
Saya sering menggunakan solusi ini
Evsenev
46

SOLUSI TETAP UNTUK SWIFT 3

cell.selectionStyle = .none
MANISH PATHAK
sumber
36

Dalam Anda UITableViewCell's XIB di Atribut nilai Inspektur set Selectionke None.

masukkan deskripsi gambar di sini

Zaid Pathan
sumber
Inilah yang saya butuhkan. Saya masih menginginkan pemberitahuan didSelect ... tetapi tanpa indikasi seleksi yang jelas. Terima kasih!
Timothy Tripp
Senang itu membantu! :)
Zaid Pathan
35

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.

Chris Fox
sumber
3
Dengan pendekatan ini, baris langsung menyorot dan kemudian menghilang lebih dari setengah detik. Beginilah cara Apple mengatur menu Pengaturan mereka, sehingga terlihat bagus untuk saya.
VinceFior
34

Jika ada yang membutuhkan jawaban untuk Swift :

cell.selectionStyle = .None
Aks
sumber
1
kita juga dapat menggunakan cell.selectionStyle ini = UITableViewCellSelectionStyle.None
bably
29

Inilah yang saya gunakan, dalam cellForRowAtIndexPathmenulis kode ini .:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ahsan Ebrahim
sumber
28

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.

pengguna41806
sumber
5
Saya tidak suka metode ini karena masih menunjukkan sel dalam keadaan yang disorot sampai menyentuh.
kbanman
2
itulah sebabnya saya suka :-)
Joris Weimar
24

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


}
Parvind
sumber
20

Tujuan-C:

  1. 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;
  2. Di bawah cuplikan penonaktifan penonaktifan dan tidak menonaktifkan panggilan ke didSelectRowAtIndexPath. Setel gaya pemilihan sel ke Tidak ada dicellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
  3. Cuplikan di bawah ini menonaktifkan semua yang ada di sel. Ini akan menonaktifkan interaksi untuk buttons, textfields:

    self.tableView.userInteractionEnabled = false;

Cepat:

Di bawah ini adalah Swiftsetara dengan Objective-Csolusi di atas :

  1. Penggantian Solusi Pertama

    self.tableView.allowsSelection = false
  2. Penggantian Solusi Kedua

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
  3. Penggantian Solusi Ketiga

    self.tableView.userInteractionEnabled = false
Arun Gupta
sumber
19

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)
}
Denis Kutlubaev
sumber
14

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:

Pengaturan 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

Yarek T
sumber
11

Kita dapat menulis kode seperti

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

tetapi ketika kita memiliki sel kustom xib di atas baris beri peringatan pada saat itu untuk

xib sel kustom

kita perlu mengatur gaya pemilihan Tidak ada dari pembuat antarmuka

iDhaval
sumber
11

Anda hanya perlu memasukkan kode ini ke cellForRowAtIndexPath

Untuk menonaktifkan properti pemilihan sel: (Sambil mengetuk sel).

cell.selectionStyle = UITableViewCellSelectionStyle.None
Gaurav Patel
sumber
Terima kasih, saya punya gambar di sel saya dan label di atasnya. Saya telah menetapkan latar belakang label, tetapi setiap kali saya mengklik latar belakang akan hilang, ini telah menyelesaikannya.
Darko
10

coba ini

cell.selectionStyle = UITableViewCellSelectionStyleNone;

dan

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

dan Anda juga dapat mengatur gaya pilihan menggunakan interfacebuilder.

v_1
sumber
10

Saya menggunakan ini, yang bekerja untuk saya.

cell?.selectionStyle = UITableViewCellSelectionStyle.None
priyanka gautam
sumber
7

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];
...
}
Steve Barden
sumber
7

Nonaktifkan penyorotan TableViewCell langsung ke storyboard

masukkan deskripsi gambar di sini

Kamani Jasmin
sumber
6

Untuk menonaktifkan sorotan dari UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Dan seharusnya tidak memungkinkan pengguna untuk berinteraksi dengan sel.

cell.userInteractionEnabled = NO;
Sharme
sumber
6

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.

virindh
sumber
6

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

Annu
sumber
Sekarang cell.selectionStyle = UITableViewCellSelectionStyle.nonedalam Swift 3.
Dan
5

Anda bisa menggunakan ini

cell.selectionStyle = UITableViewCellSelectionStyleNone;
iEinstein
sumber
5

Kamu bisa menggunakan ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Mak083
sumber
5
cell.selectionStyle = UITableViewCellSelectionStyleNone;
iDeveloper
sumber
5
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

Selamat coding !!!

Rinku Sadhwani
sumber
5

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.

Cindy
sumber