UITableView Bazı hücreleri "seçilemez" olarak ayarlama


109

UITableView'ın hücre özelliğini seçilemez olacak şekilde nasıl ayarlayabilirim? Kullanıcı hücreye dokunduğunda o mavi seçim kutusunu görmek istemiyorum.


4
Yolu iOS 6'nın olarak bunu yapmak ve daha fazla olan: son Google'cılara Not tableView:shouldHighlightRowAtIndexPath:olarak aşağıda Ayush tarafından da belirtildiği
jemmons

Yanıtlar:


151

Tablo hücresinin selectionStyleözelliğini olarak ayarlayın UITableViewCellSelectionStyleNone. Bu, vurgulamasını engellemelidir ve o mülkünüzde de kontrol edebilirsiniz tableView:didSelectRowAtIndexPath:.


3
Kendall haklı. İlk etapta didSelectRowAtIndexPath'in çağrılmasını önlemek için Sebastian Celis'in yanıtını izleyin. Vurgulamayı önlemek için selectionStyle'ı da ayarlamalısınız.
Daniel Dickison

evet sanırım Sebastian
Celis'in

1
Statik TableViews kullanan hikaye panosu hayranları bir UITableViewCell seçebilir ve Nitelikler Denetçisi altında Seçim Alanını bulabilir ve Yok olarak
Manuel BM

198

Satır Seçimini Önlemek İçin

Seçimini tamamen önlemek için UITableViewCell , senin sahip UITableViewDelegateuygulamak tableView:willSelectRowAtIndexPath:. Bu yöntemden nil, satırın seçilmesini istemiyorsanız geri dönebilirsiniz .

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

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

Bu, satırın seçilmesini ve tableView:didSelectRowAtIndexPath:çağrılmasını engeller . Ancak, bu olmadığını değil vurgulanan olmaktan satır engeller.

Satır Vurgulamayı Önlemek İçin

Görsel touch vurgulanan olmaktan satır önlemek istiyorsanız, hücre en sağlayabilirsiniz selectionStyleayarlandığında UITableViewCellSelectionStyleNoneveya tercihen sen senin olabilir UITableViewDelegateuygulamak tableView:shouldHighlightRowAtIndexPath:aşağıdaki gibi:

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

    return rowIsSelectable;
}

1
Teşekkürler! Tam olarak ihtiyacım olan şey.
Buchannon

11
Bence bu kabul edilen cevap olmalı. Aslında sorunu maskelemek yerine düzeltir.
Tovi7

4
TableView: willSelectRowAtIndexPath: öğesinin hücre vurgulandıktan sonra çağrıldığını ve bu da bir titreme oluşturacağını unutmayın. Apple'ın açıklamasından: Bu yöntem, kullanıcılar bir satıra dokunup ardından parmaklarını kaldırana kadar çağrılmaz; Rötuşta vurgulanmış olmasına rağmen satır o zamana kadar seçilmez.
Daniel

5
@SimpleBob'a katılıyorum. Bu çözümü kullanmak için, seçilemeyen satırlarda cell.selectionStyle öğesini UITableViewCellSelectionStyleNone olarak ayarlamanız gerekir. Aksi takdirde yapışkan görünüyor.
Kyle Clegg

O zaman en iyi cevap hala kabul edilen cevaptır. Hiçbir şey yapmamayı seçebilirsiniz didSelectRowAtIndexPathçünkü willSelectRowAtIndexPathher zaman zaten aranacaktır.
Matthew Quiros

16

bunu kullan:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5
Bu sadece seçim renginin gösterilmesini durdurur didSelectRowAtIndexPath, hala çağrılır.
zekel

Bu aynı zamanda Daniel Dickison'ın bu soruya verdiği cevapla tamamen aynıdır.

Swift 2.2 GÜNCELLEME - cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com

11

Yalnızca iOS 6+ için.

Yöntemi tableView:shouldHighlightRowAtIndexPath:temsilcinize uygulayabilirsiniz . Daha fazlasını buradan okuyun: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html


3
Çok daha fazla oy almalı. Bu doğru cevaptır, seçim stilini değiştirmek, böylece bir hücrenin seçildiğini göremezsiniz, kullanıcı etkileşimini devre dışı bırakır, böylece bir hücreye dokunamazsınız veya seçimdeki hücrelerin seçimini kaldırmanız hack'lerdir.
Stuart Campbell

9

Bu sorunu da yaşadım, daha önce bahsedilen her şeyi denedim. Bir tablo hücresi seçerken "mavi flaştan" kurtulan son numara şu satırı eklemekti:

self.myTableView.allowsSelection = NO;

Bunun tek bir çizgi mi yoksa her şeyin birleşimi mi olduğundan emin değilim, ancak genel sonuç olarak artık mavi seçim ve hatta mavi flaş elde edemiyorum. Mutlu!


1
Bununla ilgili sorun, bunu tablo görünümündeki tüm hücrelerin seçilebilir olmaması için yapmasıdır. Bazı hücrelerin seçilebilir olmasını ve diğerlerinin seçilebilir olmamasını istiyorsanız, bu işe yaramayacaktır. Sebastian'ın yaklaşımı benim için çalıştı.
Terry

Doğru, allowSelection = HAYIR, tüm hücreler için seçimi devre dışı bırakır.
JOM

1
Bu özellik için Interface Builder'da eşdeğer bir özellik var mı?
chrish

8

Ayarlamak cell.userInteractionEnabled = NO;


Bekle, böyle yap. Tür. 'YANLIŞ' küçük harf yapmak ve o çılgın noktalı virgül kaybetmek. Bu senin için hızlı olacak. 'YANLIŞ' kötü ve yanlıştı, şimdi 'HAYIR' kötü ve yanlıştır. Gelecek haftaya kadar 'yanlış' kötü ve yanlış olduğunda bunu bu şekilde yapın.
HalR


3

Apple, didSelectRowAtIndexPath'de yapmanız gereken ilk şeyin satırın seçimini kaldırmak olduğunu söylüyor

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

Ardından, AccessoryType'ı bir onay işareti veya hiçbiri olarak değiştirebilirsiniz, vb. Yani didSelectRowAtIndexPath girdiğinizde satırın seçimini kaldırabilirsiniz ve seçilmesi gerekmiyorsa, o satırı kontrol etmeyin.

Tablo Görünümü Programlama Kılavuzu


1
Bu durumda, bir kullanıcı hücreye dokunduğunda, kısa bir süre için vurgulanacak ve sonra vurgulanmayacaktır - ancak anladığım kadarıyla, önemli olan, vurgulamayı tamamen durdurmaktır.
Kuba Suder

3

Başka bir yol da birkaç kategori yöntemi eklemektir UITableViewCell. Bunu Sebastianların (aynı zamanda iyi) cevabından daha çok seviyorum çünkü masamı kurma şeklim. Başkasına yardımcı olabileceğini düşündüm.

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

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

3

Swift 4:
: Sen UITableViewDelegate kullanarak seçimi ve vurgulama önleyebilir shouldHighlightRowAt

: Bu cevap, özel bir hücre adında oluşturulan sahip olduğu varsayılır CustomTableViewCell
Ve özel hücre adını verdikleri bir boolean içini yarattı: 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
    }
}

Bu Sebastian Celis'in objc cevabının Swift versiyonu.


1

Hücrenizi Arayüz Oluşturucu'da tasarladıysanız, bunu için ' Kullanıcı Etkileşimi Etkin ' onay kutusunu kaldırarak yapabilirsiniz tableViewCell.


0

Seçimin mavi olarak görünmesini önlemenin başka bir basit yolu var.

Mavi olarak görünmesini istemediğiniz bir hücre seçin.

Ardından nitelik denetçisini seçin (yandaki özellikler görünümünde cetvel simgesinin yanındaki kalkan simgesi).

Ardından "Seçim" alanını "Mavi" yerine "Yok" olarak değiştirin.

Unutmayın, muhtemelen bu hala seçimdir, tüm istediğiniz UI efektini önlemekse, seçili olarak görünmeyecektir.


0

Hücreye ilk dokunduğunuzda görünen flaştan kurtulmak için tableView: didSelectRowAtIndexPath: yerine tableView: willDisplayCell: forRowAtIndexPath: kullanın.

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

0

Belirli bir satırı seçilmemiş hale getirmek için, UITableView temsilcisinin iki yönteminde bazı değişiklikler yapmanız gerekir.

Aşağıdaki yöntemde

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

hücre tahsis edildikten sonra aşağıdaki kodu yazın

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

Yukarıdaki kod, kullanıcı bir şekilde seçmeye çalışırsa hücrenin vurgulanmasını önleyecektir.

aşağıdaki bu temsilci yönteminde

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

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

Eğer if(indexPath.row == someCellNumber) return;satır yazmazsanız yine de seçilecek ve uygulamanın çökme ihtimali var


0

Swift 4:

Hücre sınıfında:

selectionStyle = .none

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.