Jawaban:
Setel selectionStyle
properti sel tabel ke UITableViewCellSelectionStyleNone
. Itu akan mencegahnya dari penyorotan, dan Anda juga dapat memeriksa properti itu di tableView:didSelectRowAtIndexPath:
.
Untuk sepenuhnya mencegah pemilihan UITableViewCell
, minta UITableViewDelegate
implementasinya tableView:willSelectRowAtIndexPath:
. Dari metode itu Anda dapat kembali nil
jika 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.
Jika Anda ingin mencegah baris tersebut disorot secara visual saat disentuh, Anda dapat memastikan bahwa sel selectionStyle
disetel ke UITableViewCellSelectionStyleNone
, atau lebih disukai Anda dapat UITableViewDelegate
menerapkannya tableView:shouldHighlightRowAtIndexPath:
sebagai berikut:
- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
// Determine if row is selectable based on the NSIndexPath.
return rowIsSelectable;
}
didSelectRowAtIndexPath
karena willSelectRowAtIndexPath
akan selalu dipanggil.
Gunakan ini:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
didSelectRowAtIndexPath
masih dipanggil.
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
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!
Set cell.userInteractionEnabled = NO;
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.
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;
}
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.
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.
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;
}
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
tableView:shouldHighlightRowAtIndexPath:
seperti yang dicatat oleh Ayush di bawah ini