Pertanyaan Bagaimana saya bisa menonaktifkan sorotan pemilihan UITableView?


Saat Anda mengetuk satu baris di a UITableView, baris disorot dan dipilih. Apakah mungkin untuk menonaktifkan ini sehingga mengetuk baris tidak melakukan apa-apa?


1074
2017-10-10 11:32


asal


Jawaban:


Bagi saya, berikut ini berfungsi dengan baik:

tableView.allowsSelection = NO;

Ini berarti didSelectRowAt# tidak akan berfungsi. Artinya, menyentuh deretan meja, dengan demikian, tidak akan melakukan apa pun. (Dan karenanya, tentu saja, tidak akan ada animasi yang dipilih.)

(Perhatikan bahwa jika, pada sel, Anda memilikinya UIButton atau kontrol lainnya, 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 baris" menggunakan didSelectRowAt#.)


496
2017-07-22 16:56



Yang harus Anda lakukan adalah mengatur gaya pemilihan pada UITableViewCell contoh menggunakan salah satu:

Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

atau

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3:

cell.selectionStyle = .none

Selanjutnya, pastikan Anda tidak mengimplementasikannya -tableView:didSelectRowAtIndexPath: dalam delegasi tampilan tabel Anda atau secara eksplisit mengecualikan sel yang tidak ingin Anda lakukan jika Anda menerapkannya.

Info lebih lanjut di sini dan sini


1829
2017-10-10 13:22



Karena saya sudah membaca posting ini baru-baru ini dan itu telah membantu saya, saya ingin memposting jawaban lain untuk mengkonsolidasikan semua jawaban (untuk anak cucu).



Jadi, sebenarnya ada 5 jawaban yang berbeda tergantung pada logika dan / atau hasil yang Anda inginkan:

1.Untuk menonaktifkan sorotan biru tanpa mengubah interaksi sel lainnya:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Saya menggunakan ini ketika saya memiliki UIButton - atau beberapa kontrol lainnya - di-host di UITableViewCell dan saya ingin pengguna untuk dapat berinteraksi dengan kontrol tetapi tidak sel itu sendiri.

CATATAN: Seperti Tony Million disebutkan di atas, ini TIDAK mencegah tableView:didSelectRowAtIndexPath:. Saya mendapatkan ini dengan pernyataan "jika" sederhana, paling sering menguji bagian dan menghindari tindakan untuk bagian tertentu.

Cara lain yang saya pikir untuk menguji penyadapan 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 dapat melakukan ini:

[cell setUserInteractionEnabled:NO];



4.Untuk membuat seluruh tabel "read-only"

[tableView setUserInteractionEnabled:NO];



5.Untuk menentukan on-the-fly apakah akan menyorot sel (yang menurut jawaban ini implisit termasuk seleksi), Anda dapat menerapkan berikut ini UITableViewDelegate metode protokol:

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath

333
2018-06-10 11:08



Untuk meringkas apa yang saya percaya adalah jawaban yang benar berdasarkan pengalaman saya sendiri dalam mengimplementasikan ini:

Jika Anda ingin menonaktifkan seleksi hanya untuk beberapa sel, gunakan:

cell.userInteractionEnabled = NO;

Serta mencegah pemilihan, ini juga menghentikan tableView: didSelectRowAtIndexPath: dipanggil untuk sel yang telah diatur. (Kredit diberikan kepada Tony Million untuk jawaban ini, terima kasih!)

Jika Anda memiliki tombol di sel Anda yang perlu diklik, Anda perlu sebagai gantinya:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

dan Anda juga perlu mengabaikan klik apa pun pada sel di - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.

Jika Anda ingin menonaktifkan pilihan untuk seluruh tabel, gunakan:

tableView.allowsSelection = NO;

(Kredit untuk Paulo De Barros, terima kasih!)


75
2018-06-01 13:32



Mulai iOS 6.0, UITableViewDelegate punya tableView:shouldHighlightRowAtIndexPath:. (Baca tentang itu di iOS Dokumentasi.)

Metode ini memungkinkan Anda menandai baris tertentu sebagai tidak bercahaya (dan implisit, tidak dapat dipilih) tanpa harus mengubah gaya pemilihan sel, mengacaukan penanganan acara sel dengan userInteractionEnabled = NO, atau teknik lain yang didokumentasikan di sini.


49
2017-10-31 21:48



Anda juga dapat menonaktifkan pemilihan baris dari pembuat antarmuka itu sendiri dengan memilih NoSelection dari selection opsi (dari UITableView Properties) di panel inspektur seperti yang ditunjukkan pada gambar di bawah ini

UITableView Inspector


45
2018-04-25 13:13



SOLUSI TETAP UNTUK SWIFT 3 

cell.selectionStyle = .none

42
2018-01-07 19:15



Dalam hal siapa pun perlu jawaban untuk Cepat:

cell.selectionStyle = .None

33
2017-12-02 09:39