टेबलव्यू पंक्ति को प्रोग्रामेटिक रूप से चुनें


135

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

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

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


मुझे एक ही समस्या का सामना करना पड़ा और लिंक ठीक है: stackoverflow.com/questions/5324501/ ... मुझे आशा है कि यह आपके लिए उपयोगी होगा।
माइकल

जवाबों:


109

से संदर्भ दस्तावेज़:

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

मैं क्या करूंगा:

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

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


4
या जब आप क्रमिक रूप से पंक्ति का चयन करते हैं, तो आप tableView कह सकते हैं: didSelectRowAtIndexPath: अपने आप (कक्षा में आपने प्रतिनिधि के रूप में वायर्ड किया है)।
केंडल हेल्मसटेटर गेलनर

3
यह तरीका मेरे लिए एक हैक की तरह लगता है, इसे काम मिल गया लेकिन मुझे लगता है कि इसे करने का एक बेहतर तरीका होना चाहिए।
तपन ठाकर

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

111

जैनुस ने बताया:

इसे कॉल करना (-selectRowAtIndexPath: animated: ScrollPosition :) विधि प्रतिनिधि को तालिका दृश्य प्राप्त करने का कारण नहीं बनता है: willSelectRowAtIndexPath: या tableView: didSlectRowAtIndexPath: संदेश, और न ही यह UITableViewSelectionDriveCid पर भेजेगा।

तो आपको बस 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)

उद्देश्य संस्करण:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 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)

63

UITableView का चयन RRAAIIndexPath: एनिमेटेड: स्क्रॉलपोजिशन: ट्रिक करना चाहिए।

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


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

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

आपके बाद selectRowAtIndexPath:animated:scrollPosition:इतना हाइलाइट होने के साथ-साथ कोई संबद्ध तर्क भी।


क्षमा करें, कि मैं क्या उपयोग कर रहा हूँ। मैंने गलती से स्क्रॉलटॉ रॉटएंडएंडएक्सपैथ डाल दिया। मैंने सवाल अपडेट किया है। ScrollToRowAtIndexPath केवल सेल को हाइलाइट करता है।
मील की दूरी पर

2
हाँ, मुझे क्षमा करें। यह कहता है कि यह फायर नहीं करेगा। DselectRowAtIndexPath वहीं डॉक्स लिंक जो मैंने पोस्ट किया है। मुझे पढ़ना सीखना होगा।
अक

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

21

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

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

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

 [someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath];

18

स्विफ्ट 3/4/5 समाधान

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

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

DeSelect Row

let deselectIndexPath = IndexPath(row: 7, section: 0)
tblView.deselectRow(at: deselectIndexPath, animated: true)
tblView.delegate?.tableView!(tblView, didDeselectRowAt: indexPath)

मेरे लिए, '.Dlegate?' कुंजी थी। (स्विफ्ट ४.५)
कोरियनओकोडकोडर्कर

4

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];

3

एक तालिका पंक्ति का चयन करने के लिए इस श्रेणी का उपयोग करें और एक देरी के बाद दिए गए सेगमेंट को निष्पादित करें।
इसे अपने 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
सवाल का सीगों से कोई लेना-देना नहीं था।
delete_user

हां, आपके उत्तर में कुछ भी प्रश्न से संबंधित नहीं है
dulgan

2
इस उत्तर की सराहना करें। यह पूरी तरह से काम करता है अगर उपयोगकर्ता समान व्यवहार को प्राप्त करना चाहता है लेकिन स्टोरीबोर्ड का उपयोग कर रहा है।
बिजॉय थंगराज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.