2010-01-09 16 views
116

मैं कैसे प्रोग्राम के रूप में एक UITableView पंक्ति का चयन करते हैं, ताकिकरें tableview पंक्ति प्रोग्राम के रूप में

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

मार डाला जाता है? selectRowAtIndexPath केवल पंक्ति को हाइलाइट करेगा।

+0

मुझे एक ही समस्या का सामना करना पड़ा और बस लिंक ठीक करें: http://stackoverflow.com/questions/5324501/select-tableviews-row-from-an-another-view मुझे आशा है कि यह आपके लिए सहायक होगा। – michael

उत्तर

103

से reference documentation:

इस विधि कॉलिंग प्रतिनिधि एक tableView:willSelectRowAtIndexPath: या tableView:didSelectRowAtIndexPath: संदेश प्राप्त करने का कारण नहीं है, न ही यह पर्यवेक्षकों के UITableViewSelectionDidChangeNotification सूचनाएं भेजता।

मुझे क्या होता है:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [self doSomethingWithRowAtIndexPath:indexPath]; 
} 

और फिर, जहां selectRowAtIndexPath फोन करना चाहता था से, आप के बजाय doSomethingWithRowAtIndexPath कहते हैं। इसके ऊपर, यदि आप यूआई फीडबैक करना चाहते हैं तो आप अतिरिक्त रूप से selectRowAtIndexPath भी कॉल कर सकते हैं।

+3

या जब आप प्रोग्राम को प्रोग्रामेटिक रूप से चुनते हैं, तो आप तालिका दृश्य को कॉल कर सकते हैं: didSelectRowAtIndexPath: स्वयं (उस वर्ग में जिसे आपने प्रतिनिधि के रूप में वायर्ड किया है)। –

+2

यह विधि मेरे लिए एक हैक की तरह प्रतीत होती है, इसे नौकरी मिल गई लेकिन मुझे लगता है कि ऐसा करने का एक बेहतर तरीका होना चाहिए। –

+1

मुझे सच में नहीं लगता कि आपको "doSomethingWithRowAtIndexPath" कॉल करने की आवश्यकता है, क्या आप प्रतिनिधि प्रतिनिधि विधि को कॉल नहीं कर सकते हैं और उस तर्क से निष्पादित तर्कों को पास कर सकते हैं जहां आपने प्रतिनिधि विधि लागू की थी? – ImpactZero

63

UITableView का selectRowAtIndexPath:animated:scrollPosition: चाल चलाना चाहिए।

स्क्रॉलपोजिशन के लिए बस UITableViewScrollPositionNone पास करें और उपयोगकर्ता को कोई भी आंदोलन दिखाई नहीं देगा।


आप मैन्युअल रूप से कार्रवाई चलाने के लिए सक्षम होना चाहिए:

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

के बाद आप selectRowAtIndexPath:animated:scrollPosition: इतना आकर्षण के रूप में अच्छी तरह से किसी भी संबद्ध तर्क के रूप में होता है।

+0

क्षमा करें, यही वह है जिसका मैं उपयोग कर रहा हूं। मैं गलती से scrollToRowAtIndexPath डाल दिया। मैंने सवाल अपडेट कर लिया है। scrollToRowAtIndexPath केवल सेल को हाइलाइट करता है। – 4thSpace

+2

हाँ, मुझे खेद है। यह कहता है कि यह पोस्ट नहीं किया जाएगा, मैंने पोस्ट किए गए दस्तावेज़ लिंक में ठीक से चयन करें। मुझे पढ़ने के लिए सीखना है। – anq

+0

@anq: बहुत बहुत धन्यवाद! यह मेरी मदद करता है जब मैं didSelectRowAtIndexPath को कॉल करता हूं: कस्टम सेल में indexPath। – Bentley

2

किसी तालिका पंक्ति का चयन करने और देरी के बाद दिए गए सेग्यू को निष्पादित करने के लिए इस श्रेणी का उपयोग करें।
अपने viewDidAppear विधि के भीतर इस कॉल:

[tableViewController delayedSelection:withSegueIdentifier:] 


@implementation UITableViewController (TLUtils) 

-(void)delayedSelection:(NSIndexPath *)idxPath withSegueIdentifier:(NSString *)segueID { 
    if (!idxPath) idxPath = [NSIndexPath indexPathForRow:0 inSection:0];                                         
    [self performSelector:@selector(selectIndexPath:) withObject:@{@"NSIndexPath": idxPath, @"UIStoryboardSegue": segueID } afterDelay:0];                        
} 

-(void)selectIndexPath:(NSDictionary *)args { 
    NSIndexPath *idxPath = args[@"NSIndexPath"];                                               
    [self.tableView selectRowAtIndexPath:idxPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];                                

    if ([self.tableView.delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)]) 
     [self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:idxPath];                                    

    [self performSegueWithIdentifier:args[@"UIStoryboardSegue"] sender:self];                                        
} 

@end 
+2

प्रश्न के पास सेग के साथ कुछ लेना देना नहीं था। –

+0

हां, आपके उत्तर में कुछ भी नहीं – dulgan

+2

से संबंधित है इस उत्तर की सराहना करें। यह पूरी तरह से काम करता है अगर उपयोगकर्ता एक ही व्यवहार प्राप्त करना चाहता है लेकिन स्टोरीबोर्ड का उपयोग कर रहा है। –

88

Jaanus तरह से कहा: एनिमेटेड: scrollPosition :) विधि प्रतिनिधि एक tableView प्राप्त करने के लिए कारण नहीं है

इस (-selectRowAtIndexPath कॉलिंग: willSelectRowAtIndexPath: या तालिका दृश्य: didSelectRowAtIndexPath: संदेश, और न ही पर्यवेक्षकों को UITableViewSelectionDidChangeNotification अधिसूचनाएं भेज देगा।

तो आपको बस delegate विधि स्वयं को कॉल करना होगा।

उदाहरण के लिए:

स्विफ्ट 3 संस्करण:

let indexPath = IndexPath(row: 0, section: 0); 
self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none) 
self.tableView(self.tableView, didSelectRowAt: indexPath) 

ObjectiveC संस्करण:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0]; 
[self.tableView selectRowAtIndexPath:indexPath 
          animated:YES 
         scrollPosition:UITableViewScrollPositionNone]; 
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath]; 

स्विफ्ट 2।3 संस्करण:

let indexPath = NSIndexPath(forRow: 0, inSection: 0); 
self.tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None) 
self.tableView(self.tableView, didSelectRowAtIndexPath: indexPath) 
+3

ग्रेट, धन्यवाद! +1 – edzio27

+1

धन्यवाद, दोस्त! अच्छा था। – Felipe

2

वहाँ iPad और iPhone प्लेटफार्मों के लिए दो अलग अलग तरीके हैं, ताकि आप दोनों को लागू करने की जरूरत है:

  • चयन हैंडलर और
  • segue।

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
    
    // Selection handler (for horizontal iPad) 
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath]; 
    
    // Segue (for iPhone and vertical iPad) 
    [self performSegueWithIdentifier:"showDetail" sender:self]; 
    
19

अगर आप कुछ पंक्ति का चयन करना चाहते हैं इस की मदद से आप

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
[someTableView selectRowAtIndexPath:indexPath 
          animated:NO 
        scrollPosition:UITableViewScrollPositionNone]; 

यह भी पंक्ति हाइलाइट किया गया होगा। तब प्रतिनिधि

[someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath]; 
6

स्विफ्ट 3.0 समाधान

चयन पंक्ति

let indexPath = IndexPath(row: 0, section: 0) 
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom) 
myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath) 

का चयन रद्द पंक्ति

let deselectIndexPath = IndexPath(row: 7, section: 0) 
tblView.deselectRow(at: deselectIndexPath, animated: true) 
tblView.delegate?.tableView!(tblView, didDeselectRowAt: indexPath) 
संबंधित मुद्दे