ios - UITableViewCell, स्वाइप पर हटाएं बटन दिखाएं




objective-c cocoa-touch (12)

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


स्विफ्ट 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()
    }

}

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

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

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

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


इसके अलावा, यह विधि के अनुसार विधि का उपयोग कर 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)
    }
}

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

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

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

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

अन्य सभी के लिए कुर्ज़ सही से जवाब है।

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

मुझे आशा है कि मैंने आपकी मदद की है।


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

मेरे पास 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
    }    
}

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

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

self.tableView.allowsMultipleSelectionDuringEditing = YES;

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

जोड़:

अपने दृश्य में निम्नलिखित विधि जोड़ें नियंत्रक:

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

इसका अर्थ यह है कि जब मल्टीइलेक्स्ट केवल तभी सक्षम होता है जब तालिका संपादन मोड में हो।


मुझे पता है कि पुराना सवाल है, लेकिन @ कर्ब्ज़ जवाब सिर्फ एक्सकोड 6.3.2 और एसडीके 8.3 के लिए इसकी आवश्यकता है

मुझे [tableView beginUpdates] और [tableView endUpdates] जोड़ने की आवश्यकता है ( here @ बे.फिलिप्स के लिए धन्यवाद)

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

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

self.tableView.allowsMultipleSelectionDuringEditing = 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
    }    
}

स्विफ्ट 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]
}

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

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);
           }
}

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

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

यह प्रोजेक्ट स्विफ्ट के लिए 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! ड्रैग को नियंत्रित करें दृश्य @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]
}

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

आईओएस 11 के लिए अपडेट किया गया

आईओएस 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])
 }

आगे की पढाई


स्विफ्ट 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]
}

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




uikit