2012-01-21 11 views
51

नहीं कहा जा रहा है मेरे पास के सबव्यूव के रूप में UITableView है, जो मेरे MainViewController द्वारा नियंत्रित मुख्य दृश्य है।didSelectRowAtIndexPath:

MainViewController.h में

@interface MainViewController : UIViewController <UIGestureRecognizerDelegate, UITableViewDelegate, UITableViewDataSource> 

// other stuff here... 

@property (weak, nonatomic) IBOutlet UITableView *myTableView; 

MainViewController.m

में
@synthesize myTableView; 

// other stuff here... 

- (void)viewDidLoad { 
    myTableView.delegate = self; 
    myTableView.datasource = self; 
} 

// other stuff here... 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { 
    [self performSegueWithIdentifier:@"listAttributesSegue" sender:self]; 
} 

मुझे पता है कि didSelectRowAtIndexPath बुलाया जा रहा है नहीं है, क्योंकि मैं दोनों विधि ही है और अंदर कोड की लाइन पर breakpoints निर्धारित किया है यह, और न ही बुलाया जा रहा है। मुझे यह भी पता है कि डेटास्रोत सही तरीके से काम कर रहा है क्योंकि मेरे पास अन्य फ़ंक्शन हैं जो रनटाइम पर कक्षों को संशोधित करते हैं और वे पूरी तरह से ठीक काम कर रहे हैं। मैं विकास लक्ष्य के रूप में आईओएस 5.0 सेट के साथ नवीनतम एक्सकोड का उपयोग कर रहा हूं। मैंने एक उत्तर खोजा और खोजा है। क्या किसी के भी पास कोई सुझाव है?

संपादित करें: मुझे जवाब मिला है। मेरे पास 0TmyTableView के सुपर व्यू के लिए सेट था। यह चयन कॉल को ओवरराइड करता है। जिसने सुझाव दिया कि वह हो सकता है क्रेडिट। इससे पहले कि मैं इसे सही चिह्नित कर सकूं, आपका उत्तर हटा दिया गया था।

संपादित करें 2: बहुत से लोग इस बारे में टिप्पणी कर रहे हैं, इसलिए मैं इसे साझा करता हूं। यदि आप इस समस्या का सामना कर रहे हैं, तो बस myGestureRecognizer.cancelsTouchInView से false पर सेट करें और सब कुछ ठीक काम करना चाहिए।

+0

क्या आपने 'tableView: willSelectRowAtIndexPath:' लागू किया था? हो सकता है कि यह वापस लौट रहा हो 'इस प्रकार से' सिलेक्ट्रोवएंड इंडेक्सपैथ: 'कॉलिंग से रोक रहा है? –

+0

हाँ मैंने कोशिश की कि – Garrett

+0

आपके समाधान के साथ लौटने के लिए धन्यवाद। मुझे लगता है कि संपादन को उत्तर के रूप में रखना बेहतर हो सकता है। –

उत्तर

263

मुझे जवाब मिला है। मेरे पास MyTableView के सुपर व्यू के लिए एक UITapGestureRecognizer सेट था। यह चयन कॉल को ओवरराइड करता है। जिसने सुझाव दिया कि वह हो सकता है क्रेडिट। इससे पहले कि मैं इसे सही चिह्नित कर सकूं, आपका उत्तर हटा दिया गया था।

इशारा पहचानने के लिए तालिका दृश्य को अनुमति देने के लिए इशारा पहचानकर्ता पर NO पर NO पर NO पर सेट करें।

+13

यह मेरे लिए समस्या थी, मेरे सहकर्मी ने यूआईटीएपीजेस्टर रिकॉग्नाइज़र को एक करीबी-टू-रूट-स्तरीय दृश्य में जोड़ा जो मेरी नल घटनाओं को खा रहा था। भ्रामक बात यह थी कि, तालिका कक्षों को तब भी हाइलाइट किया जाएगा जब उन्हें टैप किया गया था, इसलिए मुझे संदेह नहीं था कि कुछ भी उन घटनाओं को रोक रहा था। – bugloaf

+14

यह मेरे लिए भी समस्या है। इशारा पहचानकर्ता की cancelsTouchesInView संपत्ति जांचना सुनिश्चित करें।यदि यह हाँ है, तो यह घटना खाता है। –

+0

बहुत बहुत धन्यवाद, वास्तव में मेरा दिन बचाया। यह नहीं पता था कि स्टोरीबोर्ड से जोड़ा गया UITapGestureRecognizer फ़ंक्शन को कॉल करने से रोक देगा! उत्सुकता से UITableViewCells जहां अभी भी टैप्स पर प्रकाश डाला गया है। – David

5

क्या आपने समान नाम के साथ टेबलव्यू के लिए आवृत्ति चर परिभाषित किया है। यदि नहीं तो हो सकता है इस मुद्दे

_myTableView.delegate = self; 
_myTableView.datasource = self; 

या-

self.myTableView.delegate = self; 
self.myTableView.datasource = self; 
+0

मैंने self.myTableView.delegate को कोई सफलता नहीं मिली – Garrett

+1

बहुत बढ़िया! इस समस्या के लिए लंबी और चौड़ी खोज करें, और मुद्दा यह था कि मैंने सेट नहीं किया था: self.tableView.delegate = self; – hbruce

10

आपका समस्या हो सकती है केस-संवेदनशीलता है। आपका कोड:

- (void)tableVIew:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { 

होना चाहिए

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { 
+1

जो एक अच्छा पकड़ था, लेकिन गलती केवल एक टाइपो थी, जबकि मेरे कोड को प्रश्न में कॉपी करते हुए, यह मेरे ऐप – Garrett

+0

में सही है, दो लाइन कोड के बीच क्या अंतर है? –

+1

पहले "टेबल व्यू" में "i" को पहले (गलती) संस्करण में कैपिटल किया गया है। –

7

शायद यह लिखने में कोई त्रुटि सब के बाद है। जांचें कि आपका फ़ंक्शन didDeselectRowAtIndexPath: (डी चुनने के बजाय चयन करें)।

+0

मैंने अपने कोड को 20 बार बीस बार पुस्तक की तुलना में पढ़ा और अभी भी ध्यान नहीं दिया कि मैंने 'डी'सेलेक्ट' किया था! –

+0

कोड पूर्ण होने पर भरोसा करते समय गलत हो जाता है, बस इस पर एक घंटे बिताया, मुझे और भी बचाने के लिए धन्यवाद। –

1

क्षमा करें, पर्याप्त अंक टिप्पणियां जोड़ने के लिए नहीं मिला है - अटारी के जवाब महान है, लेकिन मैं जोड़ना होगा:

आप अभी भी अपने इशारे पहचानकर्ता हो सकता है, लेकिन आप नहीं करने के लिए 'दृश्य में छूता रद्द' सेट करने की आवश्यकता होगी - तब संकेतों को दृश्य में सौंप दिया जाएगा और आपका UITableView ठीक काम करेगा।

कई कोशिश करने के बाद, यह कई चीजों को करने का सही तरीका प्रतीत होता है: 'टच इश्यू' के साथ एक टैप इशारा पहचानकर्ता सभी घटनाओं को पकड़ने और उन मार्गों के शीर्ष पर एक अदृश्य परत की तरह है दृश्य नियंत्रक (प्रॉक्सी) के लिए। व्यू कंट्रोलर तब यह देखने के लिए इशारा देखता है कि उसके पास एक्शन बाइंडिंग (बटन इत्यादि) है या नहीं और उनको रूट करेगा, कोई भी शेष इशारा हैंडलर पर जाएगा। UITableView का उपयोग करते समय यह टैप प्राप्त करने की अपेक्षा कर रहा है लेकिन जब आप 'दृश्य में छूता है' तो दृश्य नियंत्रक इसे snaffles करता है।

0

मैं थोड़ी देर के लिए इस मुद्दे को हो रही थी, और मैं यहाँ यह करने के लिए किसी भी संदर्भ देखा था, इसलिए संदर्भ के लिए, इस के लिए एक और कारण यह है कि हो सकता है:

tableView.editing = YES; 

लेकिन

tableView.allowsSelectionDuringEditing = NO; 

प्रति प्रलेखन के रूप में के लिए

- tableView:didSelectRowAtIndexPath: 

इस विधि नहीं है जिसे तालिका की संपादन संपत्ति YES पर सेट की जाती है (यानी, तालिका दृश्य संपादन मोड में है)। इस विधि से संबंधित अधिक जानकारी (और कोड उदाहरण) के लिए आईओएस के लिए टेबल व्यू प्रोग्रामिंग गाइड में "चयन चयन" देखें।

5

मेरे समाधान है:

  1. सेट cancelsTouchesInView किसी भी tapGesture

  2. मैं अपने कस्टम सेल में पाई जाने वाली No करने के लिए, userInteractionEnable NO के लिए सेट है, बस userInteractionEnable = No हटा सकते हैं और हल मुद्दा।

0

एक सेल उपयोगकर्ता (पंक्ति पर दोहन) द्वारा चुना जा सकता, फोन करके "tableView.selectRowAtIndexPath (..)" या "cell.setSelected (सच है, ...)।

  • सेल को "cell.setSelected (सही)", उपयोगकर्ता द्वारा चुना जाता है अब और सेल का चयन रद्द नहीं कर सकते।

  • सेल "(tableView.selectRowAtIndexPath)" बुला द्वारा चुना जाता है, उपयोगकर्ता सेल कोके रूप में अचयनित कर सकता है 210 अपेक्षित

3

आवश्यकतानुसार अन्य विचार स्पर्श को रद्द करें।

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch { 
    if (touch.view == your view) { 
     return YES; 
    } 
    return NO; 
} 
7

स्विफ्ट 3 के लिए अपडेट किया गया:

अगर आप अपने कोड में UITapGestureRecognizer उपयोग किया जाता है: -:

extension YourViewController{ 
    func hideKeyboardWhenTappedAround() { 
     let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.dismissKeyboard)) 
     view.addGestureRecognizer(tap) 
     tap.cancelsTouchesInView = false 
    } 

    func dismissKeyboard() { 
     view.endEditing(true) 
    } 
} 
कोड की लाइनें नीचे # स्विफ्ट 3
उपयोग

कैसे कॉल किया जाए: - viewDidLoad में()

self.hideKeyboardWhenTappedAround() 
1

मेरे मामले अजीब है। मेरी तालिका दृश्य में 2 खंड हैं। प्रथम खंड की कोशिकाएं tableView:didSelectRowAt: के बारे में ठीक काम करती हैं, लेकिन दूसरे खंड की कोशिकाएं didSelectRowAt: को ट्रिगर नहीं करती हैं।

उपर्युक्त समस्या iPhone 4s, iOS 9.3 पर होती है। लेकिन iPhone 5s, iOS 10.3 में, कोई समस्या नहीं है, वे कोशिकाएं ठीक काम करती हैं। ऐसा लगता है कि iOS 9UITableView के बारे में बग्स।

कई परीक्षणों के बाद, मुझे पता चला कि एक लाइन कोड इस बग का उत्पादन करता है।

tableView.estimatedSectionHeaderHeight = 60.0 

क्योंकि दूसरे अनुभागों में कोई हेडर व्यू नहीं है। मैं इस लाइन को हटा देता हूं, और सब ठीक काम करता है।

0

मैंने किया था IlectRowAtIndexPath की विफलता विफलता: मेरे कस्टम सेल प्रेस पर कॉल किया जा रहा है।

मुझे पता चला है कि अगर मैं बुला [tableView reloadData] बहुत बार (10 हर्ट्ज) बंद कर दिया है, और यह हर 2 सेकंड अद्यतन करने के लिए, लगभग हर प्रेस सफलतापूर्वक कहेंगे बदल didSelectRowAtIndexPath:

यह दृश्य ब्लॉक पुन: लोड की तरह लगता है प्रेस।

संबंधित मुद्दे