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?


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 

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


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

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


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.


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


2
IMHO solusi terbaik
Itai Spector

Saya sering menggunakan solusi ini
Evsenev


36

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

masukkan deskripsi gambar di sini


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.


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

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

29

Inilah yang saya gunakan, dalam cellForRowAtIndexPathmenulis kode ini .:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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.


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


}

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

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

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


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


11

Anda hanya perlu memasukkan kode ini ke cellForRowAtIndexPath

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

cell.selectionStyle = UITableViewCellSelectionStyle.None

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.


10

Saya menggunakan ini, yang bekerja untuk saya.

cell?.selectionStyle = UITableViewCellSelectionStyle.None

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


6

Untuk menonaktifkan sorotan dari UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Dan seharusnya tidak memungkinkan pengguna untuk berinteraksi dengan sel.

cell.userInteractionEnabled = NO;

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.


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


Sekarang cell.selectionStyle = UITableViewCellSelectionStyle.nonedalam Swift 3.
Dan

5

Anda bisa menggunakan ini

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5

Kamu bisa menggunakan ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


5
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

Selamat coding !!!


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.