UITableView Menyetel beberapa sel sebagai "tidak dapat dipilih"


109

Bagaimana cara mengatur properti sel UITableView menjadi tidak dapat dipilih? Saya tidak ingin melihat kotak pilihan biru itu saat pengguna mengetuk sel.


4
Perhatikan googler baru-baru ini: Cara untuk melakukan ini pada iOS 6 dan yang lebih baru tableView:shouldHighlightRowAtIndexPath:seperti yang dicatat oleh Ayush di bawah ini
jemmons

Jawaban:


151

Setel selectionStyleproperti sel tabel ke UITableViewCellSelectionStyleNone. Itu akan mencegahnya dari penyorotan, dan Anda juga dapat memeriksa properti itu di tableView:didSelectRowAtIndexPath:.


3
Kendall benar. Ikuti jawaban Sebastian Celis untuk mencegah didSelectRowAtIndexPath dipanggil sejak awal. Anda juga harus menyetel selectionStyle, untuk mencegah penyorotan.
Daniel Dickison

ya saya kira jawaban Sebastian Celis adalah jawaban yang benar, terima kasih Daniel
LolaRun

1
Penggemar storyboard yang menggunakan TableView statis dapat memilih UITableViewCell dan di bawah Attributes Inspector dapat menemukan Bidang Pilihan dan menyetelnya ke Tidak Ada
Manuel BM

197

Untuk Mencegah Pemilihan Baris

Untuk sepenuhnya mencegah pemilihan UITableViewCell, minta UITableViewDelegateimplementasinya tableView:willSelectRowAtIndexPath:. Dari metode itu Anda dapat kembali niljika Anda tidak ingin baris tersebut dipilih.

- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
    // Determine if row is selectable based on the NSIndexPath.

    if (rowIsSelectable) {
        return path;
    }
    return nil;
}

Ini mencegah baris dipilih dan tableView:didSelectRowAtIndexPath:dipanggil. Namun, perhatikan bahwa ini tidak mencegah baris disorot.

Untuk Mencegah Penyorotan Baris

Jika Anda ingin mencegah baris tersebut disorot secara visual saat disentuh, Anda dapat memastikan bahwa sel selectionStyledisetel ke UITableViewCellSelectionStyleNone, atau lebih disukai Anda dapat UITableViewDelegatemenerapkannya tableView:shouldHighlightRowAtIndexPath:sebagai berikut:

- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Determine if row is selectable based on the NSIndexPath.

    return rowIsSelectable;
}

1
Terima kasih! Persis yang saya butuhkan.
Buchannon

10
Ini harus menjadi jawaban yang diterima menurut saya. Ini benar-benar memperbaiki masalah alih-alih menutupinya.
Tovi7

4
Perhatikan bahwa tableView: willSelectRowAtIndexPath: dipanggil setelah menyorot sel, yang akan menghasilkan kedipan. Dari deskripsi Apple: Metode ini tidak akan dipanggil hingga pengguna menyentuh satu baris lalu mengangkat jari mereka; baris tidak dipilih hingga saat itu, meskipun disorot saat touch-down.
Daniel

5
Saya setuju dengan @simpleBob. Untuk menggunakan solusi ini, Anda juga perlu menyetel cell.selectionStyle ke UITableViewCellSelectionStyleNone pada baris yang tidak dapat dipilih. Kalau tidak, itu terlihat norak.
Kyle Clegg

Maka jawaban terbaik tetaplah jawaban yang diterima. Anda bisa memilih untuk tidak melakukan apa-apa didSelectRowAtIndexPathkarena willSelectRowAtIndexPathakan selalu dipanggil.
Matthew Quiros

16

Gunakan ini:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5
Itu hanya menghentikan pemilihan warna untuk ditampilkan, didSelectRowAtIndexPathmasih dipanggil.
zekel

Ini juga jawaban yang persis sama dengan jawaban Daniel Dickison untuk pertanyaan ini.

PEMBARUAN Swift 2.2 - cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com

11

Hanya untuk iOS 6+.

Anda dapat mengimplementasikan metode ini tableView:shouldHighlightRowAtIndexPath:dalam delegasi Anda. Baca seterusnya di sini: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html


3
Harus memiliki lebih banyak suara. Ini adalah jawaban yang benar, mengubah gaya pemilihan sehingga Anda tidak dapat melihat sel yang dipilih, menonaktifkan interaksi pengguna sehingga Anda tidak dapat mengetuk sel atau membatalkan pilihan sel pada pemilihan adalah peretasan.
Stuart Campbell

9

Punya masalah ini, juga mencoba semua yang telah disebutkan. Trik terakhir, yang menghilangkan "kilatan biru" saat memilih sel tabel adalah menambahkan baris ini:

self.myTableView.allowsSelection = NO;

Tidak yakin apakah itu satu garis atau semuanya digabungkan, tetapi sebagai hasil yang sangat bagus saya tidak mendapatkan lagi pilihan biru atau bahkan kilatan biru. Senang!


1
Masalah dengan ini adalah membuatnya jadi semua sel dalam tampilan tabel tidak dapat dipilih. Jika Anda ingin beberapa sel dapat dipilih, dan yang lain tidak dapat dipilih, ini tidak akan berhasil. Pendekatan Sebastian berhasil untuk saya.
Terry

Benar, allowSelection = NO akan menonaktifkan seleksi untuk semua sel.
JOM

1
Apakah ada properti yang setara di Interface Builder untuk properti ini?
Chrish

8

Set cell.userInteractionEnabled = NO;


Tunggu, lakukan seperti itu. Semacam. buat huruf kecil 'FALSE' dan kehilangan titik koma gila itu. Itu akan mempercepatnya untuk Anda. 'SALAH' itu jahat dan salah, sekarang 'TIDAK' itu jahat dan salah. Sampai minggu depan ketika 'palsu' itu jahat dan salah lakukan seperti itu.
HalR

5

menggunakan IB juga merupakan cara yang elegan:

masukkan deskripsi gambar di sini


3

Apple mengatakan bahwa hal pertama yang harus Anda lakukan di didSelectRowAtIndexPath adalah membatalkan pilihan baris

[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];

Kemudian Anda dapat mengubah AccessoryType menjadi tanda centang, atau tidak ada, dll. Jadi, saat Anda memasukkan didSelectRowAtIndexPath Anda dapat membatalkan pilihan baris, dan jika tidak dimaksudkan untuk dipilih, jangan centang baris itu.

Panduan Pemrograman Tampilan Tabel


1
Dalam hal ini, ketika pengguna menyentuh sel, itu akan disorot untuk waktu yang singkat dan kemudian tidak disorot - tetapi seperti yang saya mengerti, intinya adalah menghentikannya sepenuhnya dari penyorotan.
Kuba Suder

3

Cara lain adalah dengan menambahkan beberapa metode kategori UITableViewCell. Saya lebih suka ini daripada jawaban Sebastians (juga bagus) karena cara saya membangun meja saya. Saya pikir itu mungkin berguna untuk orang lain.

- (void)setSelectable:(BOOL)enabled {
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
    [self setUserInteractionEnabled:enabled];
}

- (BOOL)isSelectable {
    BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
                     [self isUserInteractionEnabled];
    return ! disabled;
}

3

Swift 4:
Anda dapat mencegah pemilihan dan penyorotan dengan menggunakan UITableViewDelegate: shouldHighlightRowAt

Jawaban ini mengasumsikan Anda memiliki sel khusus yang dibuat bernama: CustomTableViewCell
Dan Anda telah membuat boolean di dalam sel khusus bernama: isSelectable

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
    if cell.isSelectable == false {
        return false
    } else {
        return true
    }
}

Ini adalah versi cepat dari jawaban objc Sebastian Celis.


1

Jika Anda telah mendesain sel Anda di Interface Builder, Anda dapat melakukannya dengan menghapus kotak centang dari ' User Interaction Enabled ' untuk tableViewCell.


0

Ada cara sederhana lain untuk menghindari seleksi yang muncul sebagai biru.

Pilih sel yang tidak ingin Anda munculkan berwarna biru.

Kemudian pilih inspektur atribut (ikon perisai di sebelah ikon penggaris pada tampilan properti di samping).

Kemudian ubah bidang 'Pilihan' dari 'Biru' menjadi 'Tidak Ada'.

Catatan, mungkin ini masih memilih, itu tidak akan muncul sebagai dipilih jika Anda hanya ingin menghindari efek UI.


0

Gunakan tableView: willDisplayCell: forRowAtIndexPath: alih-alih tableView: didSelectRowAtIndexPath: untuk menghilangkan flash yang muncul saat pertama kali Anda menyentuh sel.

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

0

Untuk membuat baris tertentu tidak dipilih, Anda harus membuat beberapa perubahan dalam dua metode delegasi UITableView.

Dalam metode di bawah ini

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

setelah alokasi sel, tulis kode di bawah ini

if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;

Kode di atas akan mencegah penyorotan sel, jika entah bagaimana pengguna mencoba untuk memilih.

dalam metode delegasi di bawah ini

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if(indexPath.row == someCellNumber) return;

    //for other cells write the code below...
}

jika Anda tidak menulis if(indexPath.row == someCellNumber) return;baris akan tetap dipilih dan ada kemungkinan aplikasi mogok


0

Cepat 4:

Di kelas sel:

selectionStyle = .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.