UITableViewCell, स्वाइप पर डिलीट बटन दिखाएं


568

एक पर स्वाइप करने पर मुझे डिलीट बटन कैसे दिखाई देगा UITableViewCell? ईवेंट कभी नहीं उठाया जाता है और डिलीट बटन कभी दिखाई नहीं देता है।


1
विस्तृत और अद्यतन उत्तर की तलाश में कोई भी, stackoverflow.com/a/37719543/6872794 पर
मुनिब

इसी तरह के प्रश्न के लिए मेरा स्विफ्ट 4 उत्तर देखें, जो UITableViewCells के लिए कार्रवाई को हटाने के लिए स्वाइप बनाने के 3 अलग-अलग तरीकों को दिखाता है ।
इमानौ पेटिट

मैंने यह प्रश्न 8 साल पहले पूछा था ... कृपया इस प्रश्न को हटा दें यह बड़े पैमाने पर पुराना है। स्विफ्ट भी मौजूद नहीं था!
theLearner

क्या हम साइड स्वाइप बटन के लिए ऊंचाई तय कर सकते हैं? उदाहरण: मेरा सेल १५० है और मैं चाहता हूं कि बटन केवल ५०.० एफ दिखा सके?
सुहास पाटिल

यह पंक्तियों पर बहुत अच्छा काम करता है, लेकिन इसे खंडों को कैसे एकीकृत किया जाए इस पर कोई सुराग?
Frostmourne

जवाबों:


1035

स्टार्टअप के दौरान (-viewDidLoad or in storyboard)क्या करें:

self.tableView.allowsMultipleSelectionDuringEditing = NO;

तालिका दृश्य के सशर्त संपादन का समर्थन करने के लिए ओवरराइड करें। यह केवल तभी लागू किया जाना चाहिए जब आप NOकुछ वस्तुओं के लिए वापस जाने वाले हों। डिफ़ॉल्ट रूप से, सभी आइटम संपादन योग्य हैं।

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //add code here for when you hit delete
    }    
}

94
यह काम करता है, लेकिन ... - (BOOL) tableView: (UITableView *) tableView canEditRowAtIndexPath: (NSIndexPath *) indexPath ... केवल तभी लागू किया जाना चाहिए जब आप कुछ आइटम्स के लिए NO लौट रहे हों। डिफ़ॉल्ट रूप से, सभी आइटम संपादन योग्य हैं, इसलिए आपको इसे लागू करने की आवश्यकता नहीं है यदि आप हमेशा यस लौटा रहे हैं।
थानोस डियाकिस

24
यह जानना भी महत्वपूर्ण है: ये UITableViewDataSource विधियाँ हैं और UITableViewDelegate विधियाँ नहीं हैं
डेव अल्बर्ट


12
बस स्पष्ट होने के लिए - आपको टेबल को ओवरराइड करना होगा: कमिट करें। देखें: forRowAtIndexPath: या स्वाइप जेस्चर को मान्यता नहीं दी जाएगी, और जब आप हटाने की कोशिश करेंगे तो कुछ नहीं होगा।
क्रिस

यह मेरे लिए (पहली बार में) काम नहीं आया। मुझे self.tableView.allowsMultipleSelectionDuringEditing = NO;काम करने के लिए बाएं-स्वाइप के लिए सेट करने की भी आवश्यकता थी । यह मेरे लिए एक बग की तरह लगता है क्योंकि तालिका संपादन स्थिति में नहीं है। यह विकल्प केवल "गेटवेइंग" लागू होना चाहिए। हालाँकि, यह अब काम करता है और मैं इसे हाँ में सेट करता हूं जब भी तालिका संपादन स्थिति में प्रवेश कर रही होती है।
19x14

118

यह उत्तर स्विफ्ट 3 में अपडेट किया गया है

मुझे हमेशा लगता है कि एक बहुत ही सरल, आत्म-निहित उदाहरण होना अच्छा है ताकि जब मैं एक नया कार्य सीख रहा हूं तो कुछ भी ग्रहण न करें। यह उत्तर UITableViewपंक्तियों को हटाने के लिए है । परियोजना इस तरह करती है:

यहाँ छवि विवरण दर्ज करें

यह परियोजना स्विफ्ट के लिए यूआईटेबल व्यू उदाहरण पर आधारित है ।

कोड जोड़ें

एक नया प्रोजेक्ट बनाएं और ViewController.swift कोड को निम्नलिखित के साथ बदलें।

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    // These strings will be the data for the table view cells
    var animals: [String] = ["Horse", "Cow", "Camel", "Pig", "Sheep", "Goat"]

    let cellReuseIdentifier = "cell"

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // It is possible to do the following three things in the Interface Builder
        // rather than in code if you prefer.
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        tableView.delegate = self
        tableView.dataSource = self
    }

    // number of rows in table view
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.animals.count
    }

    // create a cell for each table view row
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!

        cell.textLabel?.text = self.animals[indexPath.row]

        return cell
    }

    // method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("You tapped cell number \(indexPath.row).")
    }

    // this method handles row deletion
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete {

            // remove the item from the data model
            animals.remove(at: indexPath.row)

            // delete the table view row
            tableView.deleteRows(at: [indexPath], with: .fade)

        } else if editingStyle == .insert {
            // Not used in our example, but if you were adding a new row, this is where you would do it.
        }
    }

}

उपर्युक्त कोड में एकल कुंजी विधि जो पंक्ति विलोपन को सक्षम करती है वह अंतिम है। यहाँ यह फिर से जोर देने के लिए है:

// this method handles row deletion
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {

        // remove the item from the data model
        animals.remove(at: indexPath.row)

        // delete the table view row
        tableView.deleteRows(at: [indexPath], with: .fade)

    } else if editingStyle == .insert {
        // Not used in our example, but if you were adding a new row, this is where you would do it.
    }
}

स्टोरीबोर्ड

एक जोड़ें UITableViewस्टोरीबोर्ड में दृश्य नियंत्रक में । व्यू कंट्रोलर के किनारों पर तालिका दृश्य के चार किनारों को पिन करने के लिए ऑटो लेआउट का उपयोग करें। स्टोरीबोर्ड में टेबल व्यू @IBOutlet var tableView: UITableView!से कोड में लाइन तक ड्रैग ड्रैग करें ।

ख़त्म होना

बस इतना ही। आपको अब अपना ऐप चलाने में सक्षम होना चाहिए और बाईं ओर स्वाइप करके पंक्तियों को हटा दें और "हटाएं" टैप करें।


बदलाव

"हटाएं" बटन टेक्स्ट बदलें

यहाँ छवि विवरण दर्ज करें

निम्नलिखित विधि जोड़ें:

func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
    return "Erase"
}

कस्टम बटन क्रियाएँ

यहाँ छवि विवरण दर्ज करें

निम्न विधि जोड़ें।

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

    // action one
    let editAction = UITableViewRowAction(style: .default, title: "Edit", handler: { (action, indexPath) in
        print("Edit tapped")
    })
    editAction.backgroundColor = UIColor.blue

    // action two
    let deleteAction = UITableViewRowAction(style: .default, title: "Delete", handler: { (action, indexPath) in
        print("Delete tapped")
    })
    deleteAction.backgroundColor = UIColor.red

    return [editAction, deleteAction]
}

ध्यान दें कि यह केवल iOS 8 से उपलब्ध है । अधिक जानकारी के लिए यह उत्तर देखें।

IOS 11 के लिए अपडेट किया गया

IOS 11 में UITableViewDelegate API में जोड़े गए तरीकों का उपयोग करके सेल को अग्रणी या सेलिंग में रखा जा सकता है।

func tableView(_ tableView: UITableView,
                leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
 {
     let editAction = UIContextualAction(style: .normal, title:  "Edit", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
             success(true)
         })
editAction.backgroundColor = .blue

         return UISwipeActionsConfiguration(actions: [editAction])
 }

 func tableView(_ tableView: UITableView,
                trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
 {
     let deleteAction = UIContextualAction(style: .normal, title:  "Delete", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
         success(true)
     })
     deleteAction.backgroundColor = .red

     return UISwipeActionsConfiguration(actions: [deleteAction])
 }

आगे की पढाई


उदाहरण और कोड के लिए धन्यवाद। अब मैं डिलीट फंक्शन लागू करने के लिए तैयार हूं। क्या आप कृपया मुझे बता सकते हैं कि "self.tableView.registerClass (..." लाइन को आपने viewDidLoad () में जोड़ा है उसका उद्देश्य क्या है? और इंटरफ़ेस बिल्डर में उस के बराबर क्या है? यह कस्टम सेल उदाहरण में नहीं था। ऐसा लगता है जैसे हम सेलर्यूज़ को दो बार निर्दिष्ट कर रहे हैं। धन्यवाद!
रॉकहैमर

यदि .registerClass लाइन शामिल है, तो संकलन विफल रहता है
रॉकहैमर

@rockhammer, आप सही कह रहे हैं, आपको कोड (इंटरफ़ेस बिल्डर) में सेल पुनः उपयोग पहचानकर्ता को (जाहिरा तौर पर) सेट करने की आवश्यकता नहीं है। अपनी पसंद के अनुसार बस एक रास्ता चुनें। हालांकि इस परियोजना पर आधारित है कि बुनियादी UITableViewएक है, यह एक अकेला परियोजना पूरी तरह से खड़े है और आप कुछ भी है कि यहाँ वर्णित नहीं है क्या करने की जरूरत नहीं है। मैंने इसे कोड में सेट करने का कारण यह बताया कि मेरे उत्तरों में इसे कम व्याख्या की आवश्यकता है। मुझे वापस जाना चाहिए और कोड का उपयोग करने के लिए मूल उदाहरण को संपादित करना चाहिए।
सुरगाछ

कोई एक सही स्वाइप कैसे लागू करेगा? एक बाएं स्वाइप को कुछ "अस्वीकार" और एक सही स्वाइप "सेल में कुछ" स्वीकार करता है?
मुनिब

1
@ वापसी 0, जहाँ तक मुझे पता है, सही स्वाइप कार्यक्षमता नहीं बनी है, इसलिए आपको इसे स्क्रैच से बनाना होगा। यदि आप कोशिश करना चाहते हैं तो विचारों को शुरू करने के लिए इस लेख को देखें । हालाँकि, मैं ऐसा करने की सिफारिश नहीं करूंगा क्योंकि यह एक मानक कार्रवाई नहीं है जो एक उपयोगकर्ता को उम्मीद होगी। बल्कि, मैं बाईं ओर स्वाइप पर दो बटन विकल्प दिखाऊंगा जैसा कि ऊपर दिए गए मेरे उत्तर में कस्टम बटन एक्शन अनुभाग में है।
सुरगाछ

70

यह कोड दिखाता है कि डिलीट को कैसे लागू किया जाए।

#pragma mark - UITableViewDataSource

// Swipe to delete.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [_chats removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

वैकल्पिक रूप से, अपने आरंभिक ओवरराइड में, संपादन बटन आइटम दिखाने के लिए नीचे की पंक्ति जोड़ें:

self.navigationItem.leftBarButtonItem = self.editButtonItem;

आपको उस पद्धति को लागू करने की आवश्यकता है। जो सामग्री आपके उपयोग के मामले में समझ में आती है, उसके साथ मेल खाना चाहिए। ऊपर दिए गए कोड में _chats तालिका दृश्य के लिए समर्थन डेटा है। एक बार जब उपयोगकर्ता नष्ट हो जाता है, तो व्यक्तिगत चैट ऑब्जेक्ट को _chat से हटा दिया जाना चाहिए ताकि डेटा स्रोत फिर नई पंक्ति गणना (अन्यथा अपवाद फेंक) को प्रतिबिंबित करे।
ewcy

25

मुझे एक समस्या थी जिसे मैं हल करने में कामयाब रहा हूं इसलिए मैं इसे साझा कर रहा हूं क्योंकि यह किसी की मदद कर सकता है।

मेरे पास एक UITableView है और स्वाइप को हटाने के लिए सक्षम करने के लिए दिखाए गए तरीके जोड़े हैं:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //add code here for when you hit delete
    }    
}

मैं एक अपडेट पर काम कर रहा हूं जो मुझे टेबल को एडिट मोड में डालने की अनुमति देता है और मल्टीसेलेट को सक्षम करता है। ऐसा करने के लिए मैंने Apple के TableMultiSelect से कोड जोड़ा नमूने । एक बार जब मुझे वह काम मिला तो मैंने पाया कि मेरे स्वाइप डिलीट फंक्शन ने काम करना बंद कर दिया है।

यह पता चलता है कि देखने के लिए निम्नलिखित पंक्ति को जोड़ना यह मुद्दा था:

self.tableView.allowsMultipleSelectionDuringEditing = YES;

इस लाइन के साथ, मल्टीसेलेट काम करेगा लेकिन हटाने के लिए स्वाइप नहीं होगा। लाइन के बिना यह चारों ओर दूसरा रास्ता था।

जोड़:

निम्नलिखित विधि को अपने viewController में जोड़ें:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    self.tableView.allowsMultipleSelectionDuringEditing = editing; 
    [super setEditing:editing animated:animated];
}

फिर आपकी विधि में जो तालिका को संपादन मोड में रखती है (उदाहरण के लिए एक बटन प्रेस से) आपको उपयोग करना चाहिए:

[self setEditing:YES animated:YES];

के बजाय:

[self.tableView setEditing:YES animated:YES];

इसका मतलब यह है कि जब तालिका संपादन मोड में होती है, तो केवल बहु-आकार सक्षम होता है।


यह मददगार था। मैंने स्टोरीबोर्ड में AllowMultipleSelection सेट किया था। यह तय किया।
मार्क सुमन

1
इससे एक समस्या हल हो गई है जिसने हमें पागल कर दिया है। अब मैं समझता हूं कि "स्वाइप डिलीट करने के लिए" और "बैच डिलीट इन एडिट मोड" मूल रूप से परस्पर अनन्य हैं और आपको यह नियंत्रित करना होगा कि प्रवेश करते समय / लेविन एडिट मोड में आए। इस शोध के लिए बहुत बहुत धन्यवाद!
fbitterlich

18

नीचे UITableViewDataSource आपको स्वाइप डिलीट करने में मदद करेगा

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [arrYears removeObjectAtIndex:indexPath.row];
        [tableView reloadData];
    }
}

arrYears एक NSMutableArray है और फिर tableView को पुनः लोड करता है

तीव्र

 func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
            return true
        }

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == UITableViewCellEditingStyleDelete {
        arrYears.removeObjectAtIndex(indexPath.row)
        tableView.reloadData()
    }
}

लेकिन यह UITableViewDataSource
HotJard

17

IOS 8 और स्विफ्ट 2.0 में यह कोशिश करें,

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
   // let the controller to know that able to edit tableView's row 
   return true
}

override func tableView(tableView: UITableView, commitEdittingStyle editingStyle UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)  {
   // if you want to apply with iOS 8 or earlier version you must add this function too. (just left in blank code)
}

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]?  {
   // add the action button you want to show when swiping on tableView's cell , in this case add the delete button.
   let deleteAction = UITableViewRowAction(style: .Default, title: "Delete", handler: { (action , indexPath) -> Void in

   // Your delete code here.....
   .........
   .........
   })

   // You can set its properties like normal button
   deleteAction.backgroundColor = UIColor.redColor()

   return [deleteAction]
}

यह एक अच्छा उत्तर है, इसके साथ आप कई क्रियाओं को भी सेट कर सकते हैं।
मुनिब

11

@ कुर्बज़ का जवाब कमाल का है, लेकिन मैं इस नोट को छोड़ना चाहता हूं और उम्मीद है कि यह जवाब लोगों को कुछ समय बचा सकता है।

मेरे पास कभी-कभी मेरे नियंत्रक में ये लाइनें थीं, और उन्होंने स्वाइपिंग सुविधा को काम नहीं किया।

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    return UITableViewCellEditingStyleNone; 
}

यदि आप संपादन शैली का उपयोग करते हैं UITableViewCellEditingStyleInsertया UITableViewCellEditingStyleNoneकरते हैं, तो स्वाइपिंग सुविधा काम नहीं करती है। आप केवल उपयोग कर सकते हैं UITableViewCellEditingStyleDelete, जो कि डिफ़ॉल्ट शैली है।


1
मेरे मामले में मैं हटाने के लिए स्वाइप करने में सक्षम होना चाहता था, लेकिन फिर अपनी कोशिकाओं को स्थानांतरित करने में भी सक्षम था। एक जंगम सेल को सेल के बाईं ओर यह "डिलीट" बटन भी मिलता है, जो मेरे डिजाइन में फिट नहीं था और इसे हटाने के लिए संपादन शैली होनी चाहिए। मैंने इसे "if tableView.isEditing {रिटर्न .none} और {रिटर्न .delete}" द्वारा हल किया

मेरे कुल्हाड़ी वाले दोस्त को बचाया। धन्यवाद :)
सौरव चन्द्र

9

स्विफ्ट 4

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let delete = UITableViewRowAction(style: .destructive, title: "delete") { (action, indexPath) in
        // delete item at indexPath
    tableView.deleteRows(at: [indexPath], with: .fade)

    }
    return [delete]
}

1
ठीक है यह डिलीट टैब को प्रदर्शित करता है, लेकिन जब आप इसे दबाते हैं तो इसे डिलीट नहीं करता है। आपको डेटा स्रोत में ऑब्जेक्ट को हटाने और तालिका को पुनः लोड करने की आवश्यकता है?
user3069232

हां "// डिलीट आइटम को indexPath" पर अपनी डिलीट पंक्ति के तर्क को indexPath पर आधारित करें
Pratik Lad

8

इसके अलावा, SWIFT में इस विधि का उपयोग करके इसे प्राप्त किया जा सकता है

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if (editingStyle == UITableViewCellEditingStyle.Delete){
        testArray.removeAtIndex(indexPath.row)
        goalsTableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
    }
}

8

स्विफ्ट 3

आपको बस इन दो कार्यों को सक्षम करना है:

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

    return true

}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == UITableViewCellEditingStyle.delete {
        tableView.reloadData()
    }

}

7

मुझे पता है कि पुराना सवाल है, लेकिन @Kurbz जवाब के लिए बस Xcode 6.3.2 और SDK 8.3 की जरूरत है

मैं जोड़ने की जरूरत है [tableView beginUpdates]और [tableView endUpdates](करने के लिए धन्यवाद @ bay.phillips यहाँ )

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    // Open "Transaction"
    [tableView beginUpdates];

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // your code goes here
        //add code here for when you hit delete
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
     }

    // Close "Transaction"
    [tableView endUpdates];
}

6

जब आप अपने टेबलव्यू की एक सेल निकालते हैं, तो आपको इंडेक्स x पर अपनी एरे ऑब्जेक्ट को भी हटाना होगा।

मुझे लगता है कि आप इसे स्वाइप जेस्चर का उपयोग करके निकाल सकते हैं। तालिका दृश्य प्रतिनिधि को बुलाएगा:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //add code here for when you hit delete
        [dataSourceArray removeObjectAtIndex:indexPath.row];
    }    
}

वस्तु को हटाने के बाद। आपको टेबलव्यू उपयोग फिर से लोड करना होगा। अपने कोड में निम्नलिखित पंक्ति जोड़ें:

[tableView reloadData];

उसके बाद, आपने सफलतापूर्वक पंक्ति हटा दी है। और जब आप दृश्य को पुनः लोड करते हैं या डेटा स्रोत में डेटा जोड़ते हैं तो ऑब्जेक्ट अब नहीं होगा।

अन्य सभी के लिए कुर्ब से उत्तर सही है।

मैं केवल आपको यह याद दिलाना चाहता था कि यदि आप DataSource सरणी से ऑब्जेक्ट को निकालना चाहते हैं तो प्रतिनिधि फ़ंक्शन पर्याप्त नहीं होगा।

मुझे उम्मीद है कि मैंने आपकी मदद की है।


4
[tableView reloadData]कॉल करने के बजाय कॉल करें [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]
ma11hew28

6
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        //add code here for when you hit delete
        [dataSourceArray removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }    
}    

dataSourceArray वह सरणी है जिसमें से सेल सामग्री आती है
राहुल के राजन

2

स्विफ्ट 2.2:

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
}

override func tableView(tableView: UITableView,
    editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
    let delete = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "DELETE"){(UITableViewRowAction,NSIndexPath) -> Void in

    print("Your action when user pressed delete")
}
let edit = UITableViewRowAction(style: UITableViewRowActionStyle.Normal, title: "EDIT"){(UITableViewRowAction,NSIndexPath) -> Void in

    print("Your action when user pressed edit")
}
    return [delete, block]
}

2

स्विफ्ट के लिए, बस यह कोड लिखें

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
            print("Delete Hit")
        }
}

ऑब्जेक्टिव सी के लिए, बस इस कोड को लिखें

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
       if (editingStyle == UITableViewCellEditingStyleDelete) {           
            NSLog(@"index: %@",indexPath.row);
           }
}

2

स्विफ्ट 4 कोड के लिए, पहले संपादन सक्षम करें:

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}

फिर आप संपादित प्रतिनिधि को हटाए जाने की कार्रवाई जोड़ते हैं:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let action = UITableViewRowAction(style: .destructive, title: "Delete") { (_, index) in
        // delete model object at the index
        self.models[index.row]
        // then delete the cell
        tableView.beginUpdates()
        tableView.deleteRows(at: [index], with: .automatic)
        tableView.endUpdates()

    }
    return [action]
}

0

स्विफ्ट 4,5

स्वाइप पर एक सेल को हटाने के लिए यूआईटेबल व्यू के दो तरीके हैं। टेबलव्यू डेटा स्रोत एक्सटेंशन में इस विधि को शामिल करें।

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let delete = deleteProperty(at: indexPath)
        return UISwipeActionsConfiguration(actions: [delete])
    }

//Declare this method in Viewcontroller Main and modify according to your need

func deleteProperty(at indexpath: IndexPath) -> UIContextualAction {
        let action = UIContextualAction(style: .destructive, title: "Delete") { (action, view, completon) in
            self.yourArray.remove(at: indexpath) //Removing from array at selected index

            completon(true)
        action.backgroundColor = .red //cell background color
    }
        return action
    }

0

यदि आप अलग-अलग डेटा स्रोतों को अपना रहे हैं, तो आपको प्रतिनिधि कॉलबैक को एक UITableViewDiffableDataSourceउपवर्ग में ले जाना होगा। उदाहरण के लिए:

class DataSource: UITableViewDiffableDataSource<SectionType, ItemType> {

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            if let identifierToDelete = itemIdentifier(for: indexPath) {
                var snapshot = self.snapshot()
                snapshot.deleteItems([identifierToDelete])
                apply(snapshot)
            }
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.