2010-02-21 12 views
11

नहीं बुलाया गया मुझे पता है कि इस मुद्दे का पहले उल्लेख किया जा रहा है, लेकिन वहां पर प्रस्ताव लागू नहीं हुए। मेरे पास आईआईबी का उपयोग कर एक एम्बेडेड UITableViewController के साथ एक UINavigationController है। आईबी में UITableView के प्रतिनिधि और डेटा स्रोत दोनों UITableViewController के व्युत्पन्न पर सेट हैं। UITableViewController कक्षाओं के लिए XCode के टेम्पलेट का उपयोग करके यह कक्षा जोड़ा गया है। कोई कस्टम UITableViewCell नहीं है और तालिका दृश्य डिफ़ॉल्ट शीर्षक शैली का उपयोग एकल शीर्षक के साथ ही कर रहा है।आईफोन: didSelectRowAtIndexPath

ठीक है, सिम्युलेटर में सूची डेटा स्रोत द्वारा प्रदान किए गए दो तत्वों के साथ ठीक से प्रस्तुत की जाती है, इसलिए डेटा स्रोत ठीक से जुड़ा हुआ है। यदि मैं आईबी में डेटा स्रोत के लिए आउटलेट लिंक हटा देता हूं, तो इसके बजाय एक खाली तालिका प्रस्तुत की जाती है।

जैसे ही मैं इन दो वस्तुओं में से किसी एक पर टैप करता हूं, यह नीला चमक रहा है और में UITableView::_selectRowAtIndexPath के दायरे में जीडीबी का सामना करना पड़ता है। यह मेरी गैर-खाली विधि में ब्रेकपॉइंट सेट तक नहीं पहुंच रहा है सिलेक्टरो इंडेक्सपैथ। मैंने विभिन्न चयनकर्ताओं के परिणामस्वरूप टाइपो को बाहर करने के लिए तर्क और विधि का नाम चेक किया।

मैं हाल ही में प्रतिनिधि ठीक से सेट कर दिया जाता है कि क्या में सफल नहीं हुआ है, लेकिन के रूप में यह डेटा स्रोत जो एक ही कक्षा से दो तत्वों हो रही है करने के लिए समतुल्य रूप सेट किया गया है, मैं उम्मीद यह ठीक से स्थापित किया जाना। तो क्या गलत हुआ?

मैं आईफोन/आईपैड एसडीके 3.1.2 चला रहा हूं ... लेकिन सिम्युलेटर में आईफोन एसडीके 3.1 के साथ भी कोशिश की।

संपादित करें:

#import "LocalBrowserListController.h" 
#import "InstrumentDescriptor.h" 

@implementation LocalBrowserListController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self listLocalInstruments]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [entries count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

    if (([entries count] > 0) && ([indexPath length] > 0)) 
     cell.textLabel.text = [[[entries objectAtIndex:[indexPath indexAtPosition:[indexPath length] - 1]] label] retain]; 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (([entries count] > 0) && ([indexPath length] > 0)) 
    { 
     ... 
    } 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

- (void) listLocalInstruments { 
    NSMutableArray *result = [NSMutableArray arrayWithCapacity:10]; 

    [result addObject:[InstrumentDescriptor descriptorOn:[[NSBundle mainBundle] pathForResource:@"example" ofType:@"idl"] withLabel:@"Default 1"]]; 
    [result addObject:[InstrumentDescriptor descriptorOn:[[NSBundle mainBundle] pathForResource:@"example" ofType:@"xml"] withLabel:@"Default 2"]]; 

    [entries release]; 
    entries = [[NSArray alloc] initWithArray:result]; 
} 

@end 
+0

संभावित डुप्लिकेट [प्रोग्रामव्यू पंक्ति प्रोग्रामेटिक रूप से चुनें] (http://stackoverflow.com/questions/2035061/select-tableview-row-programmatically) – jk2K

उत्तर

3

ठीक है, सफलता के साथ स्मृति को लीक करने के लिए यूआईटीबल व्यू इंस्टेंस के प्रतिनिधि को बनाए रखने की कोशिश करने के बाद, मैंने उस मुद्दे पर जांच की और अलग-अलग एनआईबी का उपयोग करके विचारों और नियंत्रकों को गठबंधन करने के तरीके पर कुछ ट्यूटोरियल्स पर ठोकर खाई।

Combining View Controllers

विस्तार से त्रुटि पर ध्यान केंद्रित वहाँ दो UITableViewControllers ... मुख्य निब में एक एक टैब किए गए नेविगेशन नियंत्रक के लिए रूट नियंत्रक और संदर्भित निब में दूसरी बार के रूप में स्थापित किए गए: इस ट्यूटोरियल के अंत में मुझे चाल करवाया इसके बजाय कच्चे UITableView उदाहरण प्रदान करने के लिए उपयोग किया जाता है।

+0

लिंक काम नहीं कर रहा है :( –

3

कोशिश didSelectRowAtIndexPath: यह मेरा UITableViewController व्युत्पत्ति का कोड है। आपके द्वारा टाइप किए गए चयनकर्ता को चयनकर्ता नाम में "At" शब्द गुम था। willSelectRowAtIndexPath: या tableView: didSelectRowAtIndexPath:

आप


- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition 

बुला आप कर रहे हैं, तो वह प्रतिनिधि तरीकों tableView फोन नहीं होगा रहे हैं आप उन्हें अपने आप को कॉल करने के लिए होगा।

UITableView Reference देखें।

क्या इसके लायक मैं 3.0.x या 3.1.x विज्ञप्ति में तालिका दृश्य व्यवहार में कोई अंतर नहीं देखा है के लिए

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। और टाइपो के लिए खेद है, बेशक इस विधि में 'एट' शामिल है ... और मैं प्रोग्रामरेटिक रूप से selectRowAtIndexPath() को कॉल नहीं कर रहा हूं ... यह सब उपयोगकर्ता के टैप पर प्रतिक्रिया कर रहा है। मैंने उन्हें बनाने और चयन प्रबंधित करने के संबंध में UITableView दस्तावेज़ों के अधिकांश हिस्सों को पढ़ा। उपरोक्त मेरे व्युत्पन्न नियंत्रक वर्ग का कोड जोड़ा गया। – soletan

+0

एकीकृत कोड जैसे 'if ([(UITableView *) self.view प्रतिनिधि]! = Self) {...} '' viewDidLoad' में' और 'tableViewRowAtIndexPath:' से लौटने से पहले 'self' से मेल खाने के लिए प्रतिनिधि को जांचने के लिए' । इसके अलावा, मौजूदा आइटमों को टैप करने वाले आईपैड सिम्युलेटर में डीबगर को बाधित नहीं किया जाता है, लेकिन आइटम्स का चयन करें w/o दर्ज किया गया है SelectRowAtIndexPath ... जैसा कि एक्सकोड दस्तावेज़ में 100 वें पेज को संपादित करने पर वर्ड 97 की तरह व्यवहार करता है। – soletan

89

ऐप्पल के दस्तावेज़ में कहा गया है कि didSelectRowAtIndexPath:index को तब नहीं कहा जाएगा जब selectRowAtIndexPath:indexPath कहा जाता है।

[[tableView delegate] tableView:tableView didSelectRowAtIndexPath:index];

यह मूलतः प्रतिनिधि का आह्वान: निम्नलिखित didSelectRowAtIndexPath उपयोग कॉल करने के लिए।

+13

यह काफी असभ्य है! स्टैक ओवरव्लो के बारे में महान चीजों में से एक यह है कि समुदाय की मदद करता है, सिर्फ एक व्यक्ति नहीं। व्यक्तिगत रूप से, मुझे यह प्रतिक्रिया केवल वही चाहिए जो मुझे चाहिए। धन्यवाद आरपीएम –

+0

@soletan I मुझे लगता है कि मेरा जवाब स्वीकार किए गए उत्तर के रूप में चुना जाना चाहिए। बस कहना ';-) – RPM

+1

इस उत्तर ने कारण स्पष्ट रूप से समझाया और मेरी समस्या हल की। धन्यवाद! – JonSlowCN