चयनित UITableView सेल का चयन रद्द कैसे करें?


212

मैं एक ऐसी परियोजना पर काम कर रहा हूं, जिस पर मुझे एक विशेष सेल का चयन करना है।

-willDisplayCellजब मैं किसी अन्य सेल पर क्लिक करता हूं, तो मैं किसी सेल का उपयोग करने का अनुमान लगा सकता हूं , लेकिन मैं इसे रद्द नहीं कर सकता।

- (void)tableView:(UITableView*)tableView 
        willDisplayCell:(UITableViewCell*)cell
        forRowAtIndexPath:(NSIndexPath*)indexPath
{ 
    AppDelegate_iPad *appDelegte = 
      (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];

    if ([appDelegte.indexPathDelegate row] == [indexPath row])
    {
        [cell setSelected:YES];    
    } 
}

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

    AppDelegate_iPad *appDelegte = 
      (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];

    NSIndexPath *indexpath1 = appDelegte.indexPathDelegate;
    appDelegte.indexPathDelegate = indexPath;
    [materialTable deselectRowAtIndexPath:indexpath1 animated:NO];
}

क्या आप मदद कर सकते हैं?


11
इस प्रश्न का एक स्वीकृत उत्तर होना आवश्यक है
तैत्तान दे बैलेउल

जवाबों:


407

इस कोड का उपयोग करें

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
 {
    //Change the selected background view of the cell.
     [tableView deselectRowAtIndexPath:indexPath animated:YES];
 }

स्विफ्ट 3.0:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    //Change the selected background view of the cell.
    tableView.deselectRow(at: indexPath, animated: true)
}

1
पिछले एक का चयन रद्द करने के लिए उपयोग करने के लिए एक doDeselectRowAtIndexPath है।
हग्गी

3
मुझे लगता है कि मैं इस पोस्ट को अपडाउन नहीं कर सकता क्योंकि यह एक पूर्णांक अतिप्रवाह का कारण बनेगा :)
मिलो

hi @ram, आपको इस प्रश्न पर एक उत्तर का चयन करने की आवश्यकता है
Fattie

4
मुझे समझ में नहीं आता ... यह कोड कभी भी कुछ भी चयनित नहीं होने देता है।
सी। टिवाल्ट

@matrixugly सही है। यह अंदर करना अधिक उचित है willSelectRowAt:। यहाँ एक और पूरा जवाब देखें: stackoverflow.com/questions/12693402/…
HuaTham

117

तालिका दृश्य प्रतिनिधि के निम्नलिखित विधि का उपयोग करें didSelectRowAtIndexpath(या कहीं से भी)

[myTable deselectRowAtIndexPath:[myTable indexPathForSelectedRow] animated:YES];

2
यह ध्यान देने योग्य है कि indexPathForSelectedRowयह एक विधि है और संपत्ति नहीं है।
FreeAsInBeer

मिठाई! के बारे में नहीं पता था [myTable indexPathForSelectedRow]। मैं पहले कोशिकाओं के माध्यम से पाशन कर रहा था। धन्यवाद!
गुप्तकाल

@FreeAsInBeer क्या यह अंतर किसी भी तरह महत्वपूर्ण है? प्रॉपर्टी ऐक्सेसर्स विधियां हैं।
देवियो

के ठीक यही @chaiguy अगर आप अपने सहयोगियों कोई आपत्ति नहीं है आप विचार कर बुराई
FreeAsInBeer

1
@Supertecnoboff दो भिन्नताओं के बीच प्रदर्शन में कोई अंतर नहीं है।
FreeAsInBeer

38

इसे इस्तेमाल करे:

for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows) {
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
}

1
अच्छी नौकरी ... मुझे लगता है कि दूसरी पंक्ति में 'इंडेक्स' इंडेक्सपथ होना चाहिए
एल टोमैटो

यह iOS 11 स्विफ्ट 4
बोरिस निकोलिक

30

इसके लिए स्विफ्ट में विस्तार करना उपयोगी हो सकता है।

स्विफ्ट 4 और स्विफ्ट 5:

स्विफ्ट एक्सटेंशन (उदाहरण के लिए UITableViewExtension.swift फ़ाइल में):

import UIKit

extension UITableView {

    func deselectSelectedRow(animated: Bool)
    {
        if let indexPathForSelectedRow = self.indexPathForSelectedRow {
            self.deselectRow(at: indexPathForSelectedRow, animated: animated)
        }
    }

}

उदाहरण के लिए उपयोग करें:

override func viewWillAppear(_ animated: Bool)
{
    super.viewWillAppear(animated)

    self.tableView.deselectSelectedRow(animated: true)
}

1
मेरी राय में, यह उत्तर बेहतर है क्योंकि viewWillAppear()विधि में वीरानी डालने से उपयोगकर्ता को यह समझने में मदद मिलती है कि वह कहाँ से वापस आता है।
महाशय

जैसा कि मुझे आवश्यक था
पटेल जिगर

28

कृपया प्रतिनिधि विधि से जांचें कि यह सही है या नहीं। उदाहरण के लिए;

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

के लिये

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

इस पूरे समय गलत पद्धति को बुला रहा था, अर्घ !! धन्यवाद!
दामिर कोटरिक

1
अरे यार .... खूनी आटोक्लेम्पशन !!! यह पता लगाने में मुझे कई घंटे लग गए !!! OMG ... मैं तुम्हें चूम करना चाहते हैं!
जॉर्ज आसडा

22

स्विफ्ट 4:

tableView.deselectRow(at: indexPath, animated: true)

गैर-वैकल्पिक घोषित किए जाने की आवश्यकता नहीं है लेकिन यह सही है।
माइकल

16

यह स्विफ्ट 4 के लिए एक समाधान है

 in tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

बस जोड़ दो

tableView.deselectRow(at: indexPath, animated: true)

यह एक जादू की तरह काम करता है

उदाहरण:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
//some code
}

जब तक आप अपने टेबलव्यू में संपादन पर चयन नहीं जोड़ते हैं, तब तक किसी भी सेल का चयन करना असंभव होगा क्योंकि जब आप इसे
चुनेंगे

यह निश्चित रूप से सही दृष्टिकोण है, जब आप संपादन नहीं कर रहे होते हैं, जब आप "कुछ करने के लिए एक पंक्ति का दोहन कर रहे होते हैं"
फेटी

11

सेल को चयनित के रूप में स्थापित करने के अलावा, आपको यह भी सूचित करना होगा कि सेल चयनित है। -tableView:selectRowAtIndexPath:animated:scrollPosition:अपने willDisplayCell:तरीके में एक कॉल जोड़ें : और आप इसे सामान्य रूप से रद्द करने में सक्षम होंगे।

- (void)tableView:(UITableView*)tableView 
  willDisplayCell:(UITableViewCell*)cell
forRowAtIndexPath:(NSIndexPath*)indexPath
{ 
    AppDelegate_iPad *appDelegte = (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];

    if ([appDelegte.indexPathDelegate row] == [indexPath row])
    {
        // SELECT CELL
        [cell setSelected:YES]; 
        // TELL TABLEVIEW THAT ROW IS SELECTED
        [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];   
    } 
}

अजीब स्क्रॉलिंग व्यवहार से बचने के लिए UITableViewScrollPositionNone का उपयोग करना सुनिश्चित करें।


1
बिलकुल सही। मुझे लगता है कि [cell setSelected:YES]छोड़ा जा सकता है: selectRowAtIndexPathसेल की selectedस्थिति का ख्याल
रखेगा

यह उत्तर कई चयनों के साथ UITableView के लिए काम करता है। थम्स अप।
डैनी ब्रावो

6

यह काम करना चाहिए:

[tableView deselectRowAtIndexPath:indexpath1 animated:NO];

बस सुनिश्चित करें कि MaterialTable और tableView एक ही वस्तु की ओर इशारा कर रहे हैं।

क्या सामग्री इंटरफ़ेस बिल्डर में तालिका दृश्य से जुड़ी है?


मैं NO के साथ परीक्षण किया है, लेकिन यह भी मेरी समस्या का समाधान नहीं है। लेकिन मैंने इस मुद्दे को डेटा के रूप में फिर से लोड करने के साथ एक और तरीका तय किया जब कभी डेलीसेंट प्रतिनिधि ने निकाल दिया।
राम

6

सैकिरन्स समाधान के आधार पर, मैंने यह लिखा है, जिससे मुझे मदद मिली। .M फ़ाइल पर:

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

    if(selectedRowIndex && indexPath.row == selectedRowIndex.row) {

        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        selectedRowIndex = nil;

    }

    else {  self.selectedRowIndex = [indexPath retain];   }

    [tableView beginUpdates];
    [tableView endUpdates];

}

और हेडर फ़ाइल पर:

@property (retain, nonatomic) NSIndexPath* selectedRowIndex;

मैं या तो बहुत अनुभवी नहीं हूं, इसलिए मेमोरी लीक आदि की दोहरी जांच।


6

यदि आप पहले क्लिक के साथ किसी तालिका सेल का चयन करना चाहते हैं और दूसरे के साथ अचयनित करते हैं, तो आपको इस कोड का उपयोग करना चाहिए:

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

    if (self.selectedIndexPath && 
        [indexPath compare:self.selectedIndexPath] == NSOrderedSame) {

        [tableView deselectRowAtIndexPath:indexPath animated:YES];
         self.selectedIndexPath = nil;
    } 
    else {
        self.selectedIndexPath = indexPath;
    }
}

5

स्विफ्ट 4:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    let cell = tableView.cellForRow(at: indexPath)
    if cell?.isSelected == true { // check if cell has been previously selected
        tableView.deselectRow(at: indexPath, animated: true)
        return nil
    } else {
        return indexPath
    }
}

2
इसने मेरे लिए स्विफ्ट 3 में काम किया। बस इसके self.tableView(tableView, didDeselectRowAt: indexPath)बाद जोड़ना पड़ा tableView.deselectRow...क्योंकि इसे स्वचालित रूप से नहीं कहा जाता था
3:00


3

इसे इस्तेमाल करे

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];

अपना उत्तर समझाने की कोशिश करें, अन्यथा यह एक टिप्पणी होनी चाहिए।
ह्यूगो डोज़ो

3
NSIndexPath * index = [self.menuTableView indexPathForSelectedRow];
[self.menuTableView deselectRowAtIndexPath:index animated:NO];

इस कोड को अपने कोड के अनुसार रखें और आपको अपना सेल डिलेक्ट हो जाएगा।


3

क्या आप यह कोशिश कर सकते हैं?

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

    AppDelegate_iPad *appDelegte = 
    (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
    NSIndexPath *indexpath1 = appDelegte.indexPathDelegate;
    appDelegte.indexPathDelegate = indexPath;

    UITableViewCell *prevSelectedCell = [tableView cellForRowAtIndexPath: indexpath1];
    if([prevSelectedCell isSelected]){
       [prevSelectedCell setSelected:NO];
    }
}

इसने मेरे लिए काम किया।


2

स्विफ्ट 3.0:

रे वेंडरलिच स्विफ्ट स्टाइल गाइड के प्रोटोकॉल अनुरूपता खंड के बाद , संबंधित तरीकों को एक साथ समूहीकृत करने के लिए, इस एक्सटेंशन को अपने व्यू कंट्रोलर क्लास के नीचे रखें जैसे:

// your view controller
class MyViewcontroller: UIViewController {
  // class stuff here
}

// MARK: - UITableViewDelegate
extension MyViewcontroller: UITableViewDelegate {
      // use the UITableViewDelegate method tableView(_:didSelectRowAt:)
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        // your code when user select row at indexPath

        // at the end use deselectRow
        tableView.deselectRow(at: indexPath, animated: true)
    }
}

1

तीव्र

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    // your code

    // your code

    // and use deselect row to end line of this function

    self.tableView.deselectRowAtIndexPath(indexPath, animated: true)

}

1
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

1

स्विफ्ट 3

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

override func viewDidAppear(_ animated: Bool) {
    if let lastSelectedRow = tableView.indexPathForSelectedRow {
        tableView.deselectRow(at: lastSelectedRow, animated: true)
    }
}

1

स्विफ्ट 3/4

ViewController में:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

कस्टम सेल में:

override func awakeFromNib() {
    super.awakeFromNib()
    selectionStyle = .none
}


0

प्रीलोड किए गए डेटा के कारण पहली बार क्लिक किए जाने पर डिसेलेक्ट (डिडेसलेट रोवेट) आग लगाने के लिए; आपको तालिका के बारे में सूचित करना होगा कि पंक्ति को पहले से ही शुरू करने के लिए चुना गया है, ताकि एक प्रारंभिक क्लिक तब पंक्ति को रद्द कर दे:

// स्विफ्ट 3:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if tableView[indexPath.row] == "data value"

        tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)

    }
}

0

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

// Swift 3+  

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if appDelegate.indexPathDelegate.row == indexPath.row {
        self.tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none)
        cell.setSelected(true, animated: true)
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.