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.

Mugunth
sumber
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:.

Daniel Dickison
sumber
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;
}
Sebastian Celis
sumber
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;
hanumanDev
sumber
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

Ayush Goel
sumber
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!

JOM
sumber
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;

Rob Bonner
sumber
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

Brian
sumber
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

ryanday
sumber
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;
}
zekel
sumber
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.

Kejar McElroy
sumber
1

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

Jay
sumber
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.

sien
sumber
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;
}
pengguna3164248
sumber
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

Dipu Rajak
sumber
0

Cepat 4:

Di kelas sel:

selectionStyle = .none
Eden
sumber
0

Cepat 5

cell.isUserInteractionEnabled = false
S. Mert
sumber