-didSelectRowAtIndexPath: çağrılmıyor


296

Sekme görünümünde tablo görünümü olan bir iOS uygulaması yazıyorum. Benim UITableViewController, uyguladım -tableView:didSelectRowAtIndexPath:, ama çalışma zamanında bir satır seçtiğinizde, yöntem çağrılmaz. Tablo görünümü olsa doldurulur, bu yüzden denetleyicimdeki diğer tableView yöntemleri çağrıldığını biliyorum.

Herkes bunu yapmak için berbat ne olabilir herhangi bir fikri var mı?


79
Ayrıca UITableView üzerinde seçimi emen bir jest Tanıyıcı olabilir .. (olasılıklardan biri)
M.Othman

Tablo görünümü doldurulurken dikkatli olun, bu DataSource'un iyi ayarlanmış olduğu anlamına gelir. Seçim, Delege yöntemlerinin bir parçasıdır. Belki de DataSource iyi ayarlanmış ancak Temsilci değil!
Thomas Besnehard

1
Merhaba M.Othman, yorumunuz tam olarak benim sorunumda yanlış olan şey. GestureRecognizer'ın 'ile' nasıl çalışacağını biliyor musunuz UITableView?
yhl

15
Dokunup basılı tutarsam, dokunun sonunda aradığını fark ettim -didSelectRowAtIndexPath. Şapkayı anladım çünkü tablo görünümünde bir dokunma hareketi tanıyıcı var ve dokunmadan önce hareketin başarısız olması gerekiyor. Garip olsa da, masa seçimi animasyonu jest tanıyıcıdan etkilenmez.
Hlung

6
Burada aynı sorunu vardı ve UITableView üstünde bir jestRecognizer olamaz öğrenmek için şanslı bir fırsat vardı. Teşekkürler M. Othman!
vnchopra

Yanıtlar:


97

Sınıfın UITableViewDelegatebu tablo görünümü için olmadığı gibi görünüyor , ancak UITableViewControllerbunu otomatik olarak ayarlaması gerekiyor.

Temsilciyi başka bir sınıfa sıfırlama şansınız var mı?


7
Denetleyicim bir UITableViewController iken, UI Builder'da düz eski bir UIViewController widget'ı kullandığımı keşfettim. Bu işe yaramıyor. UIViewController widget'ını sildiğimde ve yerine bir UITableViewController bıraktığımda her şey işe yaradı.
Matt Pfefferle

1
Herkes için bir başka sınır davası - Delege kodunu bağladım ve daha önce delegeyi film şeridi üzerinden bağladığımı unutmuştum.
Oliver Dungey

1
nasıl "başka bir sınıfa delege sıfırlamak" gösterebilir misiniz? Aynı sorunu yaşıyorum ve çözmeyi
başaramıyorum

1
myTableViewController.tableView.delegate = xxx
Avcı

534

Birisinin benim yaptığımla aynı aptal hatayı yapması durumunda:

Olmasını beklediğiniz yöntem adının didSelectyanlışlıkla bir şekilde elde edilip edilemeyeceğini kontrol edin didDeselect. Öğrenmem yaklaşık iki saat sürdü ...


47
Burada da aynı sorun var. Çünkü XCode, Seçmeden önce Seçimi Kaldır'ı otomatik olarak tamamlar.
user1021430

Benzer şekilde, herhangi bir seçim vurgulamasının kaldırılmasının yanı sıra hücrenin basılmasını da engelleyen allowSelection = false ayarlamıştım!
djinne95

503

Soruna yol açabilecek başka bir şey, seçilen seçim türü değildir:

UITableView seçim türü

Olmalı Single Selection, normal seçim için, gereken değil olması No Selection.

Bunu programlı olarak yapmak için şunları yapın:

tableView.allowsSelection = YES

4
Her zaman düzenleme modunda olan sahnelerim olduğundan ve varsayılanı "Düzenleme Sırasında Seçim Yok" seçeneğinden değiştirmeyi unutmaya devam ettiğim için buna devam ediyorum.
Simetrik

3
Bu satırı -viewDidLoad viewControlller NSParameterAssert (self.tableView.allowsSelection) yönteminize ekleyebilirsiniz;
Nikolay Shubenkov

tableView.rx.itemSelected.subscribe'i geri
aramayanlar

bazı kod tabanını ele geçirdiğinizde çok yararlıdır ve etiketli düğmeleri kullanarak kod kullanmıştır ve didSelectRow, bu seçim film şeridinde devre dışı bırakılmıştır 🙄
Nitin Alabur

tablo Varsayılan davranışı görüntüle?
Frostmourne

296

Başka bir olasılık, burada olduğu gibi bir UITapGestureRecognizer'ın olayları yiyor olması olabilir: https://stackoverflow.com/a/9248827/214070

Bu nedenden şüphelenmedim, çünkü masa hücreleri hala musluklar geçiyormuş gibi mavi renkte vurgulayacaktı.


Bu benim sorunumdu! Çok teşekkür ederim!! Daha önce açık bir şekilde çalıştı, ancak UITapGestureRecognizer * uyguladıktan sonra çalışmayı durdurdu. [self.view addGestureRecognizer: dokunun];
coolcool1994

26
@ Coolcool1994 sadece uygulanmış aynı sorun vardı [dokunun setCancelsTouchesInView: NO]; ve sorunu çözdü.
nizx

Teşekkürler, bana yardımcı oluyor. Benim durumumda didSelectRowAtIndexPathsadece hücre silindikten sonra çalışmaz commitEditingStyle. Sonra yapmak UITapGestureRecognizerve tapAction:var indexPathdan sender.view( [self.tableView indexPathForCell:sender.view]) ve çağrı[self.tableView.delegate didSelectRowAtIndexPath:myIndexPath]
Alexmelyon

1
Bu da benim sorunum .. tableview tapgesture kaldırmak için kod eklemek ve çekicilik gibi çalışıyordu - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {UITapGestureRecognizer * gesture = [UITapGestureRecognizer ] içinde]; gesture.cancelsTouchesInView = HAYIR; [self.tableView addGestureRecognizer: jest]; }
Udaya Sri

6
Teşekkürler @nizx, hızlı 4 tap.cancelsTouchesInView = yanlış
Ariven Nadar

150

Tüm iyi cevaplar, ama dikkat edilmesi gereken bir şey daha var ...

(Özellikle programlı olarak UITableView oluştururken)

TableView öğesinin ayarlandığı [tableView setAllowsSelection:YES];herhangi bir satırı ayarlayarak veya kaldırarak seçime yanıt verebildiğinden emin olun NO.


9
Ben eklemek istiyorum setAllowsSelectionDuringEditing:(tableview düzenleme modundayken) listeye
alex-i

Teşekkür ederim! IB'de "Seçim" bölümünün değerini olarak değiştirmek zorunda kaldım Single Selection.
Sasho

90

Sorun ortaya çıkarsa UITapGestureRecognizerbunu düzeltebilirsiniz:

  • Storyboard'da:

resim açıklamasını buraya girin

ile kodu Objective-C:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap];

[tap setCancelsTouchesInView:NO];

ile kodu Swift:

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false

67

Bu durumlarda iki şeyle karşılaştım.

  1. UITableViewDelegate protokolünü uygulamayı unutmuş olabilirsiniz veya sınıfınız ile tablo görünümünüz arasında bir temsilci çıkışı yoktur.

  2. Satırınızın içinde, ilk yanıtlayıcı olan ve tıklamalarınızı alan bir UIView olabilir. Bir UIButton veya benzeri bir şey söyleyin.


5
İOS 7'de gerçekleşmeye başladı ve contentView içindeki görünümlerin "Kullanıcı Etkileşimi Etkin" devre dışı bırakıldı.
Kof

1
@Kof çivilenmiş. Xcode 5'in arayüz oluşturucusunda bir UITableViewCell oluşturmak, kullanıcı etkileşimi etkin = YES ile oluşturur. Kötü Xcode 5!
jsd

44

Aynı problemi yaşadım. Ve bulmak zordu. Ama kodumda bir yerde bu oldu:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return nil;
}

Öyle olmalı return indexPath, başka -tableView:didSelectRowAtIndexPath:çağrılmıyor.


2
for IndexPath'te SelectRow doğru imzası: - (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath {
coolcool1994 4:13

Benim için, tabloyu çağırmaya başlamaz: willSelectRowAtIndexPath tamamen silene kadar didSelectRowAtIndexPath
etayluz

38

UITableView'ın üstüne bir motionRecognizer eklediyseniz didSelectRowAtIndexPathçağrılmaz.

Bu nedenle, belirli bir görünümde dokunmayı önlemek için gestureRecognizer delege yöntemini kullanmanız gerekir.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}

3
if ([touch.view isDescendantOfView:YourTable])
Sudheesh

29

Aylar sonra benim kod bakarak değil bir sorunla karşılaştım ben gerekli olmayan bazı gereksinimleri nedeniyle aşağıdaki yöntemi uyguladı unuttum

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath  *)indexPath{
    return NO;
}

Bir satırın seçilebilmesi için EVET döndürüyor olması gerekir.


24

Bu seçenekleri seçmelisiniz

resim açıklamasını buraya girin

ancak UITableViewtıklamayı vurgulamamak istiyorsanız UITableViewCellözelliklerde değişiklik yapmanız gerekir .

Seçim için Hiçbiri seçeneğini aşağıdaki gibi seçin

resim açıklamasını buraya girin


20

UITapGestureRecognizerTablo görünümünde, didSelectRowAtIndexPath:çağrılmasını engelleyen klavyeyi kapatmak için bir koydum . Umarım birine yardımcı olur.



19

Aynı problemim vardı,

Nedeni kullanmaktı UITapGestureRecognizer. Başka bir yere dokunduğumda klavyenin kapanmasını istedim. Bunun tüm musluk eylemlerini geçersiz kıldığını fark ettim, bu yüzden didSelectRowAtIndexPathfonksiyon çağrılmadı.

İlgili satırları yorumladığımda UITapGestureRecognizerişe yarıyor. Üstelik UITapGestureRecognizer selector, vurulmuş olup olmadığını kontrol edebilirsiniz UITableViewCell.


14

Ben seçtiğinizi benim durumda, aramayacağım didSelctRowAtIndexPath nedeniyle hiçbiri de Seçim tableView özelliğine, set tek seçime sorunumu çözdü

resim açıklamasını buraya girin


11

Xcode 6.4, Swift 1.2 için. "Tag" seçimi IB'de değiştirildi. Nasıl ve neden bilmiyorum. "Tek Seçim" olarak ayarlamak tablo görünüm hücrelerimi tekrar seçilebilir hale getirdi. resim açıklamasını buraya girin


10

Başka bir yanıt kabul edilmiş olsa da, bu sorunu gözlemleyen insanlar için bir olası sorun ve çözüm daha ekleyeceğim:

Otomatik referans sayımı (ARC) açıksa, denetleyicinizi görünümün temsilcisi olarak atadıktan sonra bile, ARC denetleyiciyi sildiğinden görünümün denetleyiciye iletilerinin alınmadığını görebilirsiniz. Görünüşe göre UITableView'ın temsilci işaretçisi ARC için bir referans olarak sayılmaz, bu yüzden bu tek referans ise, denetleyici serbest bırakılır. Bunun olup olmadığını denetleyicide dealloc yöntemini uygulayarak ve orada bir kesme noktası veya NSLog çağrısı ayarlayarak doğrulayabilirsiniz.

Çözüm, artık ihtiyacınız olmayacağından emin olana kadar kontrol cihazını başka bir yerde güçlü bir referansla takip etmektir.


Görünüm hala görüntülenirken denetleyici çöp toplanıyor? Bu gerçekten olabilir mi?
Drux

@Drux Yep! Bu benim başıma geldiğinde, iOS'ta kullanılan çöp toplama ile Obj-C'nin neredeyse ilk versiyonuydu ve dürüst olmak gerekirse harika bir iş yapmadılar. Birçok referans, IMO'nun güçlü olması gerektiği açıkça veya dolaylı olarak “zayıf” idi. Bu, görüntüleme katmanı tarafından etkin kullanımda nesnelerin çöp toplanması gibi tuhaflıklara yol açtı. Bir süredir iOS çalışması yapmadım, bu yüzden hala en son sürümde olup olmadığını bilmiyorum.
Andrew Gorcester

Kodum artan bellek boyutu sorunu var ve ben sadece bu didSelect sadece ilk kez çağrı olmaz alışkanlık biraz kod ve başka bir yerde sabit. Bu sorunu haklı çıkarıyor mu bilmiyorum.
Amber K

10

Veri kaynağını ayarlamayı ve viewDidLoad yönteminde temsilci seçmeyi unutmayın:

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

Veri kaynağını arıyordum ama delege değil ... teşekkürler!
Gmeister4

9

Benim sorunum yukarıdakilerin hiçbiri değildi. Ve çok topal. Ama birine yardım etmesi için burada listeleyeceğimi düşündüm.

Bir var tableViewControllerbenim "taban" Kontrolör olduğunu ve o zaman bu kontrolörün alt sınıflarını oluşturmak. Tüm kodumu tableView:didSelectRowAtIndexPath"base" sınıfındaki rutinde yazıyordum . Varsayılan olarak bu rutinin tüm alt sınıflarımda da (hiçbir şey yapmayan kod olmasa da) oluşturulduğunu tamamen unutmak. Uygulamamı çalıştırdığımda, kodun alt sınıf sürümünü çalıştırdı, hiçbir şey yapmadı ve beni üzdü. Tabii ki, rutini alt sınıflardan çıkardığımda, mt "base" sınıfı rutini kullandım ve işteyim.

Biliyorum. Gülme. Ama belki bu birini kaybettiğim saatte kurtaracak ...


8

Bu konuda 2 sentimi veriyorum.

Özel bir UITableViewCell vardı ve tüm hücreyi kapsayan bir düğme vardı, bu yüzden dokunmatik olduğunda, düğme değil hücre seçildi.

Ya düğmeyi kaldırın ya da benim durumumda, Kullanıcı Etkileşimi Etkinleştir düğmesini yanlış olarak ayarladım, böylece hücre seçildi.


8

Bunu okursanız, sorunu hala çözmez.

Ben özel checkbox "hücreyi, Etkin Kullanıcı Etkileşimi " devre dışı oldu. Yani, sadece açıyorum. İyi şanslar.


7

Sadece bunu yaptım ve geçmişte başıma geldiği gibi işe yaramadı çünkü yöntemi eklemeye çalışırken otomatik tamamlamaya dikkat etmedim ve aslında uygulamayı tableView:didDeselectRowAtIndexPathyerine getiriyorum : yerine tableView:didSelectRowAtIndexPath:.


7

Emin olun hayata tableView:didSelectRowAtIndexPathdeğiltableView:didDeSelectRowAtIndexPath

Bu beni birkaç kez aldı!


5

Biliyorum eski ve sorun çözüldü, ama benzer bir sorun vardı, ben benim özel UITableViewCell ile sorun olduğunu düşündüm, ama çözüm tamamen farklıydı - XCode yeniden başlatın :) ve sonra tamam çalışıyor! neredeyse Windows gibi :)


5

Tablo görünümünüz düzenleme modundaysa (örn. [tableView setEditing:YES animated:NO];),tableView.allowsSelectionDuringEditing = YES;


4

Yapabileceğiniz başka bir hata (benim yaptığım gibi): hücreye bir segue ayarlarsanız, didSelectRowAtIndexPathçağrılmaz. Bunun yerine sekmelerinizi görünüm denetleyicisine ayarlamanız gerekir.


4

Bu cevapların hiçbiri benim için işe yaramadı. Yaklaşık bir saat sonra çok sinsi bir şey buldum:

Başka bir tablo görünümü hücresinin içinde bir tablo görünümü var. Diğer şeylerin yanı sıra, iç tablo görünümünü içeren kapalı bir görünüm yapmaya karar verdim. Bu görünümü contentView olarak adlandırdım ve xib'e bağladım.

UITableViewCell'in zaten bir contentView'e sahip olduğu ve onunla garip şeyler yaptığı ortaya çıkıyor. Özelliği mainContentView için yeniden adlandırdığınızda ve bu yeniden adlandırılmış özelliğe yeniden bağlandığında sorun kendiliğinden çözüldü.


4

Benim durumumda, ben dinamik olarak yüksekliğini hesaplamak TableView's SuperViewyük anda. Nedeniyle bir yanlış hesap, TableViewdışını yerleştirildi SuperView. TableViewAncak tüm etkileşim devre dışı bırakıldı, cezası çizildi (ve didSelectRowAtIndexPathhiç çağrılmadı). Tespit edilmesi çok zordur, çünkü TableView"erişilebilir" olmadığına dair görsel bir gösterge yoktur .


4

Benim durumumda sorun, bir UITableViewCellalt sınıfım vardı ve şu iki yöntemi uyguladım: touchesBegan:withEvent:& touchesEnded:withEventdokunarak süslü bir animasyonla başa çıkmak. Ancak dokunma hücresinin üst öğesini de bilgilendirmek için [super touchesBegan:touches withEvent:event];yöntem reklamını eklemeyi unuttum [super touchesEnded:touches withEvent:event];.

Bu yüzden kodu aşağıdaki şekilde değiştirmek sorunumu çözdü:

-(void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event{
    [super touchesBegan:touches withEvent:event];
    //blah blah blah
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesEnded:touches withEvent:event];
    //rest of the code
}

1
Bunun özellikle benim için OP sorununa neden olduğunu doğrulayabilir miyim
Josh Wolff

4

Benim durumumda, çözüm aşağıdaki fonksiyonda HAYIR'ı EVET olarak değiştirmekti.

iOS 9 ve sonraki sürümleri

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

Bu da benim sorunumdu. Birden çok tableView uygulaması var ve bu yöntemde iki tableViews ayırmayı unuttum.
54'te test
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.