UITableView seçimini nasıl devre dışı bırakabilirim?


1192

A içindeki bir satıra dokunduğunuzda UITableView, satır vurgulanır ve seçilir. Bunu devre dışı bırakmak mümkün mü, böylece bir satıra dokunmak hiçbir şey yapmıyor mu?


17
Orijinal sorunun başlığı kötü. OP öncelikle devre dışı bırakmak istiyor selectionve elbette highlightingbununla devre dışı bırakılıyor. Yüksek oyu alan birçok yanıt disable selection, devre dışı bırakmanın nasıl yapılacağını ve ele alınmadığını açıklar highlighting. Yalnızca vurgulamayı kullanmak için devre dışı cell.selectionStyle = .Nonebırakın veyastoryboard / cell / Selection = None
Andrej

Lütfen başlığı veya postayı güncelleyin. Kafam karıştı. Ve bu soruya dayanarak, verilen cevapların ne yapılması gerektiği hakkında hiçbir fikrim yok.
Daniel Springer

Yanıtlar:


603

Benim için aşağıdakiler işe yaradı:

tableView.allowsSelection = false

Bu, didSelectRowAt#işe yaramayacağı anlamına gelir . Yani, tablonun bir satırına dokunmak, kesinlikle hiçbir şey yapmaz. (Ve dolayısıyla, açıkçası, asla seçilmiş bir animasyon olmayacaktır.)

(Hücrelerde, UIButtonveya başka denetimleriniz varsa, elbette bu denetimlerin hala çalışacağını unutmayın. Tablo hücresinde sahip olduğunuz tüm denetimler, UITableView'un "bir satır seçmenize" izin verme yeteneğiyle tamamen ilgisizdir. kullanarak didSelectRowAt#.)

Dikkat edilmesi gereken bir diğer nokta şudur: UITableViewDüzenleme modundayken bu çalışmaz . Düzenleme modunda hücre seçimini kısıtlamak için kodu aşağıdaki gibi kullanın:

tableView.allowsSelectionDuringEditing = false 

6
Bu sonunda benim için çalıştı, cell.selectionStyle = UITableViewCellSelectionStyleNone kullanmaya çalıştım; ama işe yaramadı. Dikkat edilmesi gereken bir şey: olması gerekir: tableView.allowsSelection = NO; yanlış değil.
tony.tc.leung

6
Bence bu en iyi seçenek. Hücrelerdeki düğmeler bununla aktiftir, ancak metin aktif değildir.
Fahim Parkar

513
Bu nasıl kabul edilen bir cevap ve bu kadar oy var? Bu soruya hiç cevap vermiyor! selectionStyleÖzelliği hücrede ayarlamanız gerekir : cell.selectionStyle = UITableViewCellSelectionStyle.NoneSwift veya cell.selectionStyle = UITableViewCellSelectionStyleNoneObjective-C.
nodebase

5
Bu benim için hızlı çalışıyor 2tableView.allowSelection = false
Khanad

15
İstenene bağlı olarak bunu yapmanın birkaç yolu vardır. Hiçbir seçim stili ve hiçbir seçim her ikisi de çalışamaz veya her ikisi de başarısız olabilir. İşte bir örnek. Hücreyi seçmek istiyorsanız ve varsa tableViewDidSelectRowAtIndexPathçağrılacak, cell.selectionStyle = .Nonearzu edilir. Bu temsilci işlevinin (yani bir tableViewCell'de bir metin alanına sahip olması) çağrılmasını istemiyorsanız ya da ilgilenmiyorsanız tableView.allowsSelection = falsegayet iyi.
2

1963

Tek yapmanız gereken, UITableViewCellörnek üzerinde seçim stilini aşağıdakilerden birini kullanarak ayarlamaktır :

Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

veya

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Hızlı 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3 ve 4.x:

cell.selectionStyle = .none

Ayrıca, -tableView:didSelectRowAtIndexPath:tablo görünümü temsilcinize uygulamadığınızdan emin olun ya da uygularsanız herhangi bir işlem yapmak istemediğiniz hücreleri açıkça dışlayın.

Burada ve burada daha fazla bilgi


122
@Tony Hücrenin içinde bir UITextField varsa kötü bir fikir.
Aniruddh Joshi

73
@TonyMillion, silmek için hızlıca kaydırma gibi yerleşik düzenleme denetimlerini kullanmak istiyorsanız da kötü bir fikirdir. UserInteractionEnabled öğesini NO olarak ayarlarsanız, sil düğmesi kullanıcı dokunma olaylarına yanıt vermez.
Carlos P

47
bu iş parçacığına geç, ancak userInteraction yerine cell.allowsSelection kullanın. Bu, hücrenin etkileşim yöntemlerini durdurur, ancak normal UIView yanıtlayıcı öğelerini engellemez.
Chris C

4
Cell.userInteractionEnable = Hayır ayarı bir didSelectRowAtIndexPath tetiklemeyi durdurmaz.
user4951

25
Cevabı oylayacağım, ama sadece açık olmak gerekirse, OP sadece "vurgulamayı" devre dışı bırakmak istedi, tüm hücre etkileşimini devre dışı bırakmak için hayır, bu yüzden tüm yorumlar offtopik.
Frederic Yesid Peña Sánchez

353

Bu yazıyı son zamanlarda okuduğum ve bana yardımcı olduğu için, tüm cevapları birleştirmek için başka bir cevap yayınlamak istedim (gelecek için).



Yani, istediğiniz mantığa ve / veya sonuca bağlı olarak aslında 5 farklı cevap vardır:

Hücrenin başka bir etkileşimini değiştirmeden mavi vurgulamayı devre dışı bırakmak için:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Ben bir UIBableViewCell barındırılan bir UIButton - veya başka bir kontrol (ler) var ve ben kullanıcı kontrolleri ile etkileşim ancak hücrenin kendisi için etkileşim istiyorum istiyorum.

NOT : Tony Million'un yukarıda belirttiği gibi, bu engellemeztableView:didSelectRowAtIndexPath:. Bunu basitçe "if" ifadeleriyle hallederim, çoğunlukla bölümü test eder ve belirli bir bölüm için eylemden kaçınırım.

Böyle bir hücrenin tıkanmasını test etmeyi düşündüğüm başka bir yol:

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



Tüm bir tablo için bunu yapmak için, yukarıdaki çözümü tablodaki her hücreye uygulayabilirsiniz, ancak bunu da yapabilirsiniz:

[tableView setAllowsSelection:NO];

Testlerimde, bu hala içindeki kontrollerin UITableViewCelletkileşimli olmasına izin veriyor .


Bir hücreyi "salt okunur" hale getirmek için şunları yapabilirsiniz:

[cell setUserInteractionEnabled:NO];



4.Tüm bir tabloyu "salt okunur" yapmak

[tableView setUserInteractionEnabled:NO];



5.Bir hücrenin vurgulanıp vurgulanmayacağını belirlemek için ( bu cevaba göre dolaylı olarak seçimi içerir), aşağıdaki UITableViewDelegateprotokol yöntemini uygulayabilirsiniz :

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

3
Hücre tasarımını bir uçtan yüklerseniz, onay kutusu (IB'de) # 3 (ve # 4 için tablolarda) için iyi çalışır. # 4 ve # 2 için, hücre içindeki kontrollerin etkileşimli olup olmayacağı arasındaki fark nedir?
lilbyrdie

4
Evet. Seçimi devre dışı bırakmak, ancak UIButton'ların vb. Kullanıcı etkileşimini desteklemeye devam etmesine izin vermek istiyorsanız # 2 kullanın. Tamamen salt okunur bir hücre istiyorsanız # 4 kullanın. Tabii ki, neden etkileşimli olmayan bir hücrede UIViews veya UILabel'den başka bir şey elde edersiniz. Belki birileri başka bir şey olurken tüm etkileşimi devre dışı bırakmak isteyebilir.
mbm29414

8
# 4 korkunç bir fikir, bunu yapmak da tablo görünümünde kaydırmayı devre dışı bırakacak
simon

4
@simon Aslında, bu korkunç bir fikir değil; koşullarınıza bağlı olarak iyi bir seçenek olabilecek veya olmayabilecek bir seçenektir. Ayrıca # 4, USER kaydırmasını devre dışı bırakır; gerekirse yine de kendinizinkini uygulayabilirsiniz. # 4'ün ÇOK yararlı olmadığını kabul ediyorum, ama korkunç bir fikir değil.
mbm29414

3
Tamlık için tableView:shouldHighlightRowAtIndexPath:, genellikle (her zaman değil) tercih ettiğim yaklaşım olan bir not ekleyin .
Benjohn

82

Neyi düşündüğümü özetlemek gerekirse, bunu uygulama konusundaki kendi deneyimime dayalı doğru cevaplar:

Yalnızca bazı hücreler için seçimi devre dışı bırakmak istiyorsanız, şunu kullanın:

cell.userInteractionEnabled = NO;

Seçimi engellemenin yanı sıra, bu ayarlanmış hücreler için tableView: didSelectRowAtIndexPath: çağrılmasını da durdurur. (Bu cevap için kredi Tony Million'a gidiyor, teşekkürler!)

Hücrelerinizde tıklanması gereken düğmeler varsa bunun yerine şunları yapmanız gerekir:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

ve içindeki hücredeki tıklamaları da yok saymanız gerekir - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath .

Tüm tablo için seçimi devre dışı bırakmak istiyorsanız, şunu kullanın:

tableView.allowsSelection = NO;

(Paulo De Barros'a teşekkür ederiz, teşekkürler!)


ne Hücremizde bir düğme varsa?
Umair Afzal

56

İOS 6.0 itibariyle UITableViewDelegatevardır tableView:shouldHighlightRowAtIndexPath:. (İOS Belgeleri'nde bu konuyla ilgili bilgi edinin .)

Bu yöntem, bir hücrenin seçim stilini değiştirmek, hücrenin olay işlemesi userInteractionEnabled = NOveya burada belgelenen diğer tekniklerle uğraşmak zorunda kalmadan belirli satırları vurgulanamaz (ve dolaylı olarak seçilemez) olarak işaretlemenizi sağlar .


2
Bu iş parçacığı karşısında tökezledi ve bundan önce çok daha fazla cevap görmek şok oldu. Bu hiç şüphesiz doğru yoldur.
beebcon

2
Bu gerçekten dikkate alınması gereken doğru ve tek cevaptır. UserInteraction'dan bahseden her şey tamamen yanlış.
mattyohe

50

Sen seçerek kendisini inşaatçı arayüzünden sıranın devre dışı seçimi de can NoSelectiondan selectionaşağıdaki resimde gösterildiği gibi müfettiş bölmesinde (UITableView Özelliklerinin) seçeneğiyle

UITableView Denetçisi


2
En iyi çözüm IMHO
Itai Spector

Bu çözümü sık sık kullanıyorum
Evsenev


36

Sizin de UITableViewCell'ın XIB'nin ait Özellik Müfettiş seti değerindeki Selectioniçin None.

resim açıklamasını buraya girin


Tam da ihtiyacım olan şey bu. Hala didSelect ... bildirimini istedim ama görünür seçim göstergesi olmadan. Teşekkürler!
Timothy Tripp

Yardımcı oldu sevindim! :)
Zaid Pathan

35

Seçimin yalnızca yanıp sönmesini istiyorsanız, seçilen durumda kalmazsanız,

didSelectRowAtIndexPath

aşağıdaki

[tableView deselectRowAtIndexPath:indexPath animated:YES];

böylece seçilen durumu yanıp söner ve geri döner.


3
Bu yaklaşımla, satır anında vurgulanır ve yarım saniye içinde kaybolur. Apple, Ayar menülerini bu şekilde şekillendiriyor, bu yüzden bana iyi geliyor.
VinceFior

34

Herkesin Swift için cevaba ihtiyacı olması durumunda :

cell.selectionStyle = .None

1
biz de bu cell.selectionStyle = UITableViewCellSelectionStyle.None kullanabilirsiniz
bir ihtimalle

29

Bu cellForRowAtIndexPathkodu yazarken kullandığım budur . :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

28

Gönderen UITableViewDelegateProtokol Eğer yöntemi kullanabilirsiniz willSelectRowAtIndexPath ve return nilsen satır seçili istemiyorsanız.

Aynı şekilde, willDeselectRowAtIndexPathyöntemi kullanabilirsiniz ve return nilsatırın seçimini yapmak istemiyorsanız.


5
Bu yöntemi sevmiyorum çünkü hücreyi rötuşa kadar vurgulanmış durumda gösteriyor.
kbanman

2
Tam da bu yüzden beğendim :-)
Joris Weimar

24

1- Tek yapmanız gereken ,UITableViewCell örnek üzerinde seçim stilini aşağıdakilerden birini kullanarak ayarlamaktır :


Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

veya

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


Hızlı 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None


Hızlı 3:

cell.selectionStyle = .none


2 - Uygulamayın - tableView:didSelectRowAtIndexPath:tablo görünümünüzde delegate, eylemde bulunmasını istediğiniz hücreleri uygularsanız veya açıkça hariç tutarsanız.

3 - Ayrıca, film şeridinden de yapabilirsiniz. Tablo görünümü hücresini tıklatın ve Tablo Görünümü Hücresi altındaki özellikler denetçisinde, Seçim'in yanındaki açılır listeyi Yok olarak değiştirin.


4 - (iOS) Xcode 9, Swift 4.0'daki aşağıdaki kodu kullanarak tablo hücresi vurgulamasını devre dışı bırakabilirsiniz

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
        cell.selectionStyle = .none
        return cell


}

20

Objective-C:

  1. Snippet'in altında vurgulamayı devre dışı bırakın ancak aynı zamanda çağrıyı da devre dışı bırakır didSelectRowAtIndexPath. Yani uygulama yapmıyorsanız, didSelectRowAtIndexPathaşağıdaki yöntemi kullanın. Bu, tablo oluştururken eklenmelidir. Bu düğmeler ve UITextFieldhücre içinde çalışacaktır .

    self.tableView.allowsSelection = NO;
  2. Snippet'in altında vurgulamayı devre dışı bırakın ve adresine yapılan çağrıyı devre dışı bırakmaz didSelectRowAtIndexPath. Hücrenin seçim stilini Yok'ta olarak ayarlayıncellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
  3. Snippet'in altındaki hücredeki her şeyi devre dışı bırakın. Bu kadar etkileşimi devre dışı bırakacak buttons, textfields:

    self.tableView.userInteractionEnabled = false;

Swift:

SwiftYukarıdaki Objective-Cçözümlerin eşdeğeri aşağıdadır :

  1. İlk Çözümün Değiştirilmesi

    self.tableView.allowsSelection = false
  2. İkinci Çözeltinin Değiştirilmesi

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
  3. Üçüncü Çözümün Değiştirilmesi

    self.tableView.userInteractionEnabled = false

19

Yazmaya çalışın:

cell.selected = NO;

Gerektiğinde satırınızın seçimini kaldıracaktır.

Swift3'te ...

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let r = indexPath.row
    print("clicked .. \(r)")
    tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}

14

Ben bununla oldukça bolca mücadele ettim UITableViewCell, userInteractionEnabledmülk kullanımımın kontrolünde olması . Ben ayarları için 3 hücreli statik tablo var, tarihleri ​​2, bir açma / kapama düğmesi ile 1. Storyboard / IB'de oynadıktan sonra, alt kısmı seçilemez hale getirmeyi başardım, ancak dokunduğunuzda üst sıralardan birindeki seçim kaybolur. İşte UITableView ayarlarımın WIP görüntüsü:

Ayarlar UITableView

3. satıra dokunursanız hiçbir şey olmaz, seçim ikinci satırda kalır. Bu işlevsellik, Apple'ın Takvim uygulamasının etkinlik zamanı ekle seçim ekranının bir kopyasıdır.

Kod şaşırtıcı derecede uyumludur, IOS2 = /:

- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 2) {
        return nil;
    }
    return indexPath;
}

Bu, seçim stilini hiçbiri olarak ayarlamamayla birlikte çalışır, bu nedenle hücre, dokunma olaylarında titremez


11

Gibi kod yazabiliriz

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

ama biz varken özel hücre xib çizgisi üzerinde vermek uyarı için o zaman

özel hücre xib

Biz gerek arayüz oluşturucu gelen kümesi seçme tarzı Yok


11

Bu kodu cellForRowAtIndexPath içine koymanız yeterli

Hücrenin seçim özelliğini devre dışı bırakmak için: (Hücreye dokunurken).

cell.selectionStyle = UITableViewCellSelectionStyle.None

Teşekkür ederim, hücremde bir resim ve üstünde bir etiket var. Etiket arka planını ayarladım, ancak her tıkladığımda arka plan kaybolur, bu çözüldü.
Darko

10

bunu dene

cell.selectionStyle = UITableViewCellSelectionStyleNone;

ve

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

ve arayüz stilini kullanarak seçim stilini de ayarlayabilirsiniz.


10

Benim için çalışan bunu kullanıyorum.

cell?.selectionStyle = UITableViewCellSelectionStyle.None

7

Bu, bir satırın seçim sırasında vurgulamayı göstermesini önlemek için en iyi ve en kolay çözüm olsa da

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Ayrıca, satırın kısa bir süre için seçildiğini ve sonra kapatıldığını göstermenin bazen yararlı olduğunu da belirtmek isterim. Bu, kullanıcıları seçmek istediklerinin bir onayı ile uyarır:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}

7

TableViewCell'in vurgulamayı film şeridine doğrudan devre dışı bırakın

resim açıklamasını buraya girin


6

UItableviewcell'in vurgulanmasını devre dışı bırakmak için

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Ve kullanıcının hücre ile etkileşime girmesine izin vermemelidir.

cell.userInteractionEnabled = NO;

6

Kullanmak UITableViewCellSelectionStyleNoneistemiyorsanız / kullanamamanız durumunda aynı efekti elde etmek için arka plan rengini Temizle olarak da ayarlayabilirsiniz UITableViewCellSelectionStyleNone.

Aşağıdaki gibi bir kod kullanırsınız:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

Bu, her hücreye fazladan renkli bir görünüm ekledikçe performansınızı düşürebilir .


6

Kullanabilirsiniz :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

UITableView'ınızın dizin yolu yöntemindeki satır hücresinde.

Ayrıca şunları kullanabilirsiniz:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

Tablo görünümünde didselectrowatindexpath yöntemi.


Şimdi cell.selectionStyle = UITableViewCellSelectionStyle.noneSwift 3'te.
Dan

5

Bunu kullanabilirsiniz

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5

Kullanabilirsiniz ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


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

Mutlu kodlama !!!


5

Film şeridinden de yapabilirsiniz. Tablo görünümü hücresini tıklatın ve Tablo Görünümü Hücresi altındaki özellikler denetçisinde, Seçim'in yanındaki açılır listeyi Yok olarak değiştirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.