-didelectRowAtIndexPath: बुलाया नहीं जा रहा है


295

मैं एक टैब दृश्य के अंदर एक टेबल व्यू के साथ एक आईओएस ऐप लिख रहा हूं। मेरे में UITableViewController, मैंने लागू किया -tableView:didSelectRowAtIndexPath:, लेकिन जब मैं रनटाइम पर एक पंक्ति का चयन करता हूं, तो विधि को नहीं बुलाया जा रहा है। हालाँकि, तालिका दृश्य पॉप्युलेट किया जा रहा है, इसलिए मुझे पता है कि मेरे नियंत्रक में अन्य तालिका दृश्य विधियों को बुलाया जा रहा है।

क्या किसी के पास कोई विचार है जो मैंने ऐसा करने के लिए खराब कर दिया है?


79
यूआईटेबल व्यू के शीर्ष पर भी आपके पास एक इशारा-पहचानकर्ता हो सकता है जो चयन को अवशोषित करता है .. (संभावनाओं में से एक)
एम। ओथमान

सावधान रहें यदि टेबल दृश्य आबाद हो रहा है, तो इसका मतलब है कि डेटा स्रोत अच्छी तरह से सेट है। चयन डेलिगेट विधियों का हिस्सा है। तो शायद डेटा स्रोत अच्छी तरह से सेट है, लेकिन प्रतिनिधि नहीं!
थॉमस बेस्नेहर्ड

1
हाय एम। ओथमैन, आपकी टिप्पणी ठीक वही है जो मेरे अपने मुद्दे पर गलत थी। क्या आप जानते हैं कि '' के साथ काम करने के तरीके को कैसे पहचानें UITableView?
yhl

15
मैंने देखा कि यदि मैं टैप और होल्ड करता हूं, तो टैप अंततः कॉल करता है -didSelectRowAtIndexPath। मुझे टोपी का पता चला क्योंकि मेरे पास टेबलव्यू पर एक टैप जेस्चर पहचानकर्ता है और इशारे को टच प्राप्त करने से पहले विफल होना पड़ता है। हालांकि यह अजीब है कि टेबल चयन एनीमेशन जेस्चर पहचानकर्ता से प्रभावित नहीं है।
हुलंग

6
मुझे यहाँ भी यही समस्या थी और यह सीखने का सौभाग्य प्राप्त हुआ था कि आप UITVIEW के शीर्ष पर एक जेस्चरक्राइज़र नहीं रख सकते। धन्यवाद एम। ओथमैन!
vnchopra

जवाबों:


97

ऐसा लगता है कि शायद कक्षा UITableViewDelegateउस तालिका दृश्य के लिए नहीं है , हालांकि UITableViewControllerइसे स्वचालित रूप से सेट करना है।

किसी भी मौका आप प्रतिनिधि को किसी अन्य वर्ग में रीसेट कर सकते हैं?


7
मुझे पता चला कि जब मेरा नियंत्रक UITableViewController था, तो मैंने UI बिल्डर में एक सादे पुराने UIViewController विजेट का उपयोग किया था। यह काम नहीं करता है। जब मैंने UIViewController विजेट को हटा दिया और UITableViewController को उसके स्थान पर गिरा दिया, तो सब कुछ काम कर गया।
20:30 बजे मैट फाफरेले

1
हर किसी के लिए एक और सीमा-मामला - मैंने प्रतिनिधि को कोड में तार दिया था और मैं भूल गया था कि मैंने पहले ही स्टोरीबोर्ड के माध्यम से प्रतिनिधि को तार दिया था .... इसे जीतने के लिए सेट किया था।
ओलिवर डेंगी

1
क्या आप यह दिखा सकते हैं कि "प्रतिनिधि को किसी अन्य वर्ग में कैसे रीसेट करें" कृपया? मेरे पास यह एक ही मुद्दा है और इसे हल करने का प्रबंधन नहीं किया जा सकता है
अल्फरो जूल

1
myTableViewController.tableView.delegate = xxx
हंटर

534

जैसे ही किसी ने मुझसे वैसी ही मूर्खतापूर्ण गलती की:

अगर didSelectगलती didDeselectसे किसी तरह की उम्मीद की जा सकती है, तो विधि का नाम देखें । यह पता लगाने में मुझे लगभग दो घंटे लगे ...


47
एक ही मुद्दा यहाँ। इसका कारण यह है कि XCode सेलेक्ट से पहले Deselect को ऑटोकम्प्लीट करता है।
user1021430

इसी तरह, मैंने allowSelection = false निर्धारित किया था, जो किसी भी चयन हाइलाइट को हटाने के साथ-साथ सेल को दबाने से भी रोकता है!
djinne95

503

एक और चीज़ जो समस्या को जन्म दे सकती है वह है चयन प्रकार नहीं:

UITableView चयन प्रकार

होना चाहिए Single Selectionसामान्य चयन के लिए, चाहिए नहीं हो No Selection

यह प्रोग्राम करने के लिए, करें:

tableView.allowsSelection = YES

4
मैं इसमें भागता रहता हूं क्योंकि मेरे पास ऐसे दृश्य हैं जो हमेशा संपादन मोड में होते हैं और मैं "संपादन के दौरान चयन नहीं" से डिफ़ॉल्ट को बदलना भूल जाता हूं।
सममिति

3
आप अपने लाइन-व्यूडालड विधि में इस लाइन को जोड़ सकते हैं देखने का तरीका NSParameterAssert (self.tableView.allowsSelection);
निकोले शुबेनकोव

जो लोग tableView.rx.itemSelected.subscribe का अवलोकन करते हैं, उनके लिए कॉल वापस नहीं आती है, यह समस्या है और ठीक काम के ऊपर
ढिल्लिप

बहुत उपयोगी है जब आप कुछ कोडबेस लेते हैं और इसमें टैग के साथ बटन का उपयोग करते हुए कोड होता है और डिस्क्लेमर नहीं होता है, इस चयन के साथ स्टोरीबोर्ड में अक्षम होता है in
नितिन अलाउर

क्या यह टेबल व्यू डिफ़ॉल्ट व्यवहार है?
फ्रॉस्टमॉर्न

296

एक और संभावना यह है कि एक UITapGestureRecognizer घटनाओं को खा सकता है, जैसा कि यहाँ था: https://stackoverflow.com/a/9248827/214070

मुझे इस कारण पर संदेह नहीं था, क्योंकि टेबल सेल अभी भी नीले रंग को उजागर करेंगे जैसे कि नल के माध्यम से हो रहे थे।


यह मेरी समस्या थी! बहुत बहुत धन्यवाद!! मेरा मतलब है कि यह स्पष्ट रूप से पहले काम करता था, लेकिन मैंने UITapGestureRecognizer * टैप = [[UITapGestureRecognizer आबंटित] initWithTarget: आत्म क्रिया: @selector (बर्खास्त करना))] को लागू करने के बाद काम करना बंद कर दिया; [self.view addGestureRecognizer: टैप];
coolcool1994

26
आपके पास @ coolcool1994 लागू होने पर भी मुझे यही समस्या थी [नल setCancelsTouchesInView: NO]; और इस मुद्दे को हल किया।
nizx

धन्यवाद, यह मेरी मदद करता है। मेरे मामले didSelectRowAtIndexPathमें सेल हटाने के बाद ही काम नहीं करता है commitEditingStyle। तब मैं बनाने UITapGestureRecognizerऔर में tapAction:मिल गया indexPathसे sender.view( [self.tableView indexPathForCell:sender.view]) और कॉल[self.tableView.delegate didSelectRowAtIndexPath:myIndexPath]
Alexmelyon

1
यह मेरा मुद्दा भी था .. टेबलव्यू में टेपेस्ट्री को हटाने के लिए कोड जोड़ें और यह आकर्षण की तरह काम करता था - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexxath: (NSIndexPath *) indexPath {UITapGestureRecognizer * जेस्चर ] इस में]; gesture.cancelsTouchesInView = NO; [self.tableView addGestureRecognizer: इशारा]; }
उदय श्री

6
धन्यवाद @nizx, स्विफ्ट 4 टैप में ।ancelsTouchesInView = false
एरवेन नादर

150

सभी अच्छे उत्तर, लेकिन एक और बात है ...

(विशेष रूप से UITableView प्रोग्राम बनाते समय)

सुनिश्चित करें कि तालिका दृश्य चयन करने [tableView setAllowsSelection:YES];या उस पर सेट किसी भी पंक्ति को हटाकर उत्तर दे सकती है NO


9
मैं setAllowsSelectionDuringEditing:सूची में जोड़ूंगा (जब टेबलव्यू एडिटिंग मोड में है)
एलेक्स- i

धन्यवाद! आईबी में मुझे "चयन" अनुभाग मान में बदलना पड़ा Single Selection
साशो

90

यदि UITapGestureRecognizerआपके साथ समस्या उत्पन्न होती है, तो आप इसे ठीक कर सकते हैं:

  • स्टोरीबोर्ड में:

यहां छवि विवरण दर्ज करें

के साथ कोड में Objective-C:

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

[tap setCancelsTouchesInView:NO];

के साथ कोड में Swift:

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

tap.cancelsTouchesInView = false

67

मैंने इस स्थितियों में दो चीजों का सामना किया है।

  1. आप UITableViewDelegate प्रोटोकॉल को लागू करना भूल गए होंगे, या आपकी कक्षा और आपके टेबल व्यू के बीच कोई डेलिगेशन आउटलेट नहीं होगा।

  2. आपके पास अपनी पंक्ति के अंदर एक UIView हो सकता है जो एक पहला प्रत्युत्तर है और आपके क्लिकों को दूर ले जाता है। UIButton कहें या ऐसा ही कुछ।


5
यह iOS 7 पर होना शुरू हुआ, इसने contentView के भीतर "उपयोगकर्ता सहभागिता सक्षम" विचारों को अक्षम कर दिया।
कोफ

1
@Kof ने इसे रद्द कर दिया। Xcode 5 के इंटरफ़ेस बिल्डर में UITableViewCell बनाना उपयोगकर्ता की सहभागिता सक्षम = YES के साथ बनाता है। खराब Xcode 5!
jsd

44

मेरी भी यही समस्या थी। और इसे खोजना मुश्किल था। लेकिन कहीं न कहीं मेरे कोड में यह था:

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

होना ही चाहिए return indexPath, दूसरे -tableView:didSelectRowAtIndexPath:को नहीं बुलाया जा रहा है।


2
के लिए SelectRow पर IndexPath सही हस्ताक्षर है: - (शून्य) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath
coolcool1994

मेरे लिए, यह tableView को कॉल करना शुरू नहीं करेगा: didSelectRowAtIndexPath जब तक मैंने विल नहीं हटा दिया ।SelectRowAtIndexPath पूरी तरह से
etayluz

38

यदि आपने UITableView के शीर्ष पर एक जेस्चरराइज़र जोड़ा है, didSelectRowAtIndexPathतो कॉल नहीं किया जाएगा।

तो आपको विशेष दृश्य में स्पर्श से बचने के लिए जेस्चर रिकॉगनाइजर प्रतिनिधि विधि का उपयोग करने की आवश्यकता है।

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

3
if ([touch.view isDescendantOfView:YourTable])
सुधीश

29

मैं एक समस्या में भाग गया हूं, जहां मेरे कोड को न देखने के महीनों के बाद मैं भूल गया कि मैंने कुछ आवश्यकताओं के कारण निम्नलिखित विधि को लागू किया है जो आवश्यक नहीं थे

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

इसे चयनित करने के लिए किसी पंक्ति के लिए YES वापस करना चाहिए।


24

आप इन विकल्पों का चयन अवश्य करें

यहां छवि विवरण दर्ज करें

लेकिन अगर आप UITableViewक्लिक करने पर प्रकाश नहीं डालना चाहते हैं तो आपको UITableViewCellगुणों में बदलाव करना चाहिए ।

नीचे की तरह चयन के लिए कोई भी विकल्प न चुनें

यहां छवि विवरण दर्ज करें


20

मैंने UITapGestureRecognizerकीबोर्ड को खारिज करने के लिए अपने टेबल व्यू पर डाल दिया था didSelectRowAtIndexPath:जिसे कॉल करने से रोका गया था। आशा है कि यह किसी की मदद करता है।


19

यदि आपके पास मेरे जैसी ही समस्या है: जाहिरा तौर पर, इस पद्धति को कॉल नहीं किया जाएगा यदि आपका टेबल व्यू एडिट मोड में है। आपको allowSelectionDuringEditing को सही पर सेट करना होगा।

इस प्रश्न के माध्यम से: संपादन करते समय, `UITableView` ने didSelectRowAtIndexPath को कॉल नहीं किया ??


19

मुझे भी यही समस्या थी,

कारण का उपयोग कर रहा था UITapGestureRecognizer। मैं चाहता था कि जब मैं कहीं और टेप करूं तो कीबोर्ड खारिज हो जाए। मैंने महसूस किया कि यह सभी टैप क्रियाओं को ओवरराइड करता है, इसीलिए, didSelectRowAtIndexPathफ़ंक्शन को कॉल नहीं किया गया।

जब मैं इससे संबंधित पंक्तियों पर टिप्पणी करता हूं UITapGestureRecognizer, तो यह काम करता है। इसके अलावा आप UITapGestureRecognizer selectorअगर टेप किया गया है UITableViewCellया नहीं है के कार्य में जाँच कर सकते हैं।


14

मेरे मामले में, didSelctRowAtIndexPath कॉल न करने के कारण है कि मैंने tableView की चयन संपत्ति में से किसी का चयन नहीं किया है , एकल चयन पर सेट करने से मेरी समस्या हल हो गई है

यहां छवि विवरण दर्ज करें


11

Xcode 6.4 के लिए, स्विफ्ट 1.2। चयन "टैग" को आईबी में बदल दिया गया था। मैं नहीं जानता कि कैसे और क्यों। इसे "सिंगल सेलेक्शन" में सेट करके मेरी टेबल व्यू सेल को फिर से चयन करने योग्य बनाया। यहां छवि विवरण दर्ज करें


10

हालांकि एक और जवाब स्वीकार कर लिया गया है, मैं इस समस्या को देखने वाले लोगों के लिए एक और संभावित समस्या और समाधान जोड़ूंगा:

यदि आपके पास स्वचालित संदर्भ गणना (ARC) चालू है, तो आप पा सकते हैं कि आपके प्रतिनिधि को दृश्य के प्रतिनिधि के रूप में असाइन करने के बाद भी, नियंत्रक को दृश्य के संदेश प्राप्त नहीं हो रहे हैं क्योंकि ARC नियंत्रक को हटा रहा है। जाहिरा तौर पर UITableView का प्रतिनिधि सूचक एआरसी के लिए एक संदर्भ के रूप में नहीं गिना जाता है, इसलिए यदि यह केवल इसका संदर्भ है, तो नियंत्रक डीललोक हो जाएगा। आप यह सत्यापित कर सकते हैं कि नियंत्रक पर डीललोक पद्धति को लागू करने और वहां एक ब्रेकपॉइंट या NSLog कॉल सेट करके यह हो रहा है या नहीं।

समाधान यह है कि कंट्रोलर का ध्यान कहीं और मजबूत संदर्भ के साथ रखें, जब तक कि आप सुनिश्चित न हों कि आपको इसकी आवश्यकता नहीं होगी।


नियंत्रक को कचरा-संग्रहित किया जा रहा है जबकि उसका दृश्य अभी भी प्रदर्शित है? क्या वास्तव में ऐसा हो सकता है?
Drux

@ ड्रक्स हां! जब मेरे साथ ऐसा हुआ, तो यह ओबज-सी का पहला संस्करण था, जिसमें आईओएस पर इस्तेमाल किया गया कचरा संग्रह था और ईमानदारी से उन्होंने बहुत अच्छा काम नहीं किया। बहुत सारे संदर्भ स्पष्ट रूप से या स्पष्ट रूप से "कमजोर" थे कि, आईएमओ, मजबूत होना चाहिए था। जिसके कारण प्रदर्शन परत द्वारा सक्रिय उपयोग में वस्तुओं के कचरा संग्रह जैसी विषमताएं पैदा हुईं। मैंने कुछ समय में iOS का काम नहीं किया है इसलिए मुझे अभी तक इसका कोई अंदाजा नहीं है अगर यह अभी भी नवीनतम संस्करण में होता है।
एंड्रयू गोरसेस्टर

मेरे कोड में मेमोरी साइज़ की समस्या बढ़ रही है और मैंने इसे कुछ हद तक ठीक कर दिया है और कहीं और कोड के बाद यह किया है कि पहले कभी नहीं कहा जाता है। मैं नहीं जानता कि यह समस्या को उचित ठहराता है या नहीं।
अंबर के

10

डेटाशैड को सेट करना और दृश्यमान विधि में प्रतिनिधि निम्नानुसार याद रखें:

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

मैं डेटा स्रोत कह रहा था, लेकिन प्रतिनिधि नहीं ... धन्यवाद!
गमेस्टर 4

9

मेरी समस्या उपरोक्त में से कोई नहीं थी। और इसलिए लंगड़ा। लेकिन मैंने सोचा कि अगर मैं किसी की मदद करता हूं तो मैं इसे यहां सूचीबद्ध करूंगा।

मेरे पास एक tableViewController"मेरा" आधार नियंत्रक है और फिर मैं इस नियंत्रक के उपवर्गों का निर्माण करता हूं। मैं अपने सभी कोड tableView:didSelectRowAtIndexPathको "बेस" क्लास में रूटीन में लिख रहा था । पूरी तरह से यह भूल जाते हैं कि डिफ़ॉल्ट रूप से यह दिनचर्या भी बनाई गई थी (जिसमें कोई कोड नहीं है कि कुछ भी किया हो) मेरे सभी उपवर्गों में भी। इसलिए जब मैंने अपना ऐप चलाया, तो उसने कोड के सबक्लास संस्करण को चलाया, कुछ नहीं किया और मुझे दुखी किया। इसलिए बेशक, एक बार जब मैंने उपवर्गों से दिनचर्या को हटा दिया, तो इसने "आधार" वर्ग की दिनचर्या का उपयोग किया और मैं व्यवसाय में हूं।

मुझे पता है। हंसो मत। लेकिन शायद यह किसी को मेरे खोए हुए घंटे को बचा लेगा ...


8

इस पर मेरा 2 सेंट देना।

मेरे पास एक कस्टम UITableViewCell था और पूरे सेल को कवर करने वाला एक बटन था, इसलिए जब टच हुआ, तो बटन का चयन किया गया था और सेल का नहीं।

या तो बटन को हटा दें या मेरे मामले में, मैंने उपयोगकर्ता इंटरएक्शन सक्षम करें बटन पर गलत सेट किया, इस तरह सेल एक चुना गया था।


8

यदि आप इसे पढ़ते हैं, तो अभी भी समस्या हल नहीं होती है।

मेरे पास कस्टम सेल है, जहां चेकबॉक्स " उपयोगकर्ता सहभागिता सक्षम " अक्षम था। तो, मैं बस उस पर स्विच। सौभाग्य।


7

मेरे पास बस यह था और जैसा कि अतीत में मेरे साथ हुआ है, यह काम नहीं किया क्योंकि मैंने पद्धति को जोड़ने की कोशिश में स्वत: पूर्ण पर ध्यान नहीं दिया था और मैं वास्तव में लागू करना चाहता हूं tableView:didDeselectRowAtIndexPath: इसके बजाय tableView:didSelectRowAtIndexPath:


7

सुनिश्चित करें कि आपने लागू किया है tableView:didSelectRowAtIndexPathऔर नहींtableView:didDeSelectRowAtIndexPath

यह मुझे कुछ अवसरों से अधिक पर मिल गया है !!


5

मुझे पता है कि पुरानी है और समस्या हल हो गई थी, लेकिन एक समान समस्या थी, मैंने सोचा कि समस्या मेरे कस्टम UITableViewCell के साथ थी, लेकिन समाधान पूरी तरह से अलग था - मैं XCode को पुनरारंभ करता हूं :) और फिर ठीक काम करता है! लगभग विंडोज की तरह :)


5

यदि आपका टेबल दृश्य संपादन मोड (उदाहरण के लिए [tableView setEditing:YES animated:NO];) में है, तो आपको सेट करने की आवश्यकता हैtableView.allowsSelectionDuringEditing = YES;


4

एक और गलती जो आप कर सकते थे (जैसा कि मैंने किया): यदि आप सेल में एक सेगमेंट सेट करते हैं, तो didSelectRowAtIndexPathउसे नहीं कहा जाता है। आपको अपने सेगमेंट को इसके बजाय व्यू कंट्रोलर पर सेट करना चाहिए।


4

इनमें से किसी भी उत्तर ने मेरे लिए काम नहीं किया। लगभग एक घंटे के बाद, मुझे लगा कि कुछ बहुत कपटी है:

मेरे पास किसी अन्य तालिका दृश्य के कक्ष के अंदर एक तालिका दृश्य है। मैंने अन्य चीजों के साथ-साथ आंतरिक तालिका दृश्य को सम्मिलित करने वाला एक दृश्य बनाने का निर्णय लिया। मैंने इस दृश्य contentView को कॉल किया और इसे xib में झुका दिया।

यह बताता है कि UITableViewCell में पहले से ही एक contentView है और इसके साथ अजीब चीजें करता है। समस्या ने स्वयं को हल कर लिया जब मैंने संपत्ति का नाम बदलकर mainContentView किया और इस पुनर्नामित संपत्ति के दृश्य को फिर से जोड़ दिया।


4

मेरे मामले में, मैं गतिशील की ऊंचाई की गणना TableViewके SuperViewलोड होने पर। एक मिसकॉल के कारण, के TableViewबाहर तैनात किया गया था SuperViewTableViewठीक तैयार की गई थी, लेकिन सभी बातचीत विकलांग था (और didSelectRowAtIndexPathकभी नहीं कहा जाता था)। पता लगाने के लिए बहुत मुश्किल है, क्योंकि कोई दृश्य संकेत नहीं है कि TableView"सुलभ" नहीं है।


4

मेरे मामले में समस्या यह थी कि मेरे पास एक UITableViewCellउपवर्ग था और मैंने इन दो तरीकों को लागू किया: touchesBegan:withEvent:और touchesEnded:withEventस्पर्श पर एक फैंसी एनीमेशन को संभालने के लिए। लेकिन मैं [super touchesBegan:touches withEvent:event];विधि विज्ञापन जोड़ना भूल गया[super touchesEnded:touches withEvent:event]; स्पर्श के सेल के जनक को सूचित करने के ।

इसलिए मेरी समस्या को हल करने के लिए कोड को बदलना:

-(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
पुष्टि कर सकते हैं कि यह विशेष रूप से मेरे लिए ओपी की समस्या का कारण बना
जोश वोल्फ

4

मेरे मामले में समाधान नीचे के समारोह में NO को YES में बदलना था।

iOS 9+

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

मेरी भी यही समस्या थी। मेरे पास एक एकाधिक तालिका दृश्य कार्यान्वयन है और इस पद्धति में दो तालिका दृश्य अलग करना भूल गया है।
turingtested
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.