UITableView हटाने के लिए स्वाइप को अक्षम कर देता है, लेकिन फिर भी संपादन मोड में हटा दिया है?


91

मुझे अलार्म ऐप के समान कुछ चाहिए, जहां आप पंक्ति को स्वाइप नहीं कर सकते, लेकिन फिर भी आप संपादन मोड में पंक्ति को हटा सकते हैं।

जब तालिका से बाहर की टिप्पणी की गई: कमेटीसेंटाइल: forRowAtIndexPath :, मैंने हटाने के लिए स्वाइप को अक्षम कर दिया और फिर भी संपादन मोड में हटाएं बटन था, लेकिन जब मैं हटाता बटन दबाता हूं तो क्या होता है। क्या कहा जाता है?

जवाबों:


286

ठीक है, यह काफी आसान है। इसे हल करने के लिए मैंने यही किया है:

उद्देश्य सी

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Detemine if it's in editing mode
    if (self.tableView.editing)
    {
        return UITableViewCellEditingStyleDelete;
    }

    return UITableViewCellEditingStyleNone;
}

स्विफ्ट 2

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
    if tableView.editing {
         return .Delete
    }

    return .None
}

स्विफ्ट 3

override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    if tableView.isEditing {
        return .delete
    }

    return .none
}

आपको अभी भी tableView:commitEditingStyle:forRowAtIndexPath:विलोपन करने के लिए कार्यान्वित करने की आवश्यकता है ।


bu फिर हटाने के लिए स्वाइप स्वचालित रूप से सक्षम है, दोबारा। या नहीं?
मैसिमो कैपरो

नहीं, हटाने के लिए स्वाइप सक्षम नहीं है, अगर यह संपादन मोड में नहीं है। इसलिए मैं डिफ़ॉल्ट रूप में UITableViewCellEditingStyleNone लौटाता हूं।
16

3
भूल उल्लेख नहीं है कि आप की जरूरत है (editingStyle == UITableViewCellEditingStyleDelete) commitEditingStyle में:
विल्ली

ठीक है, इस कथन के साथ आपको हटाए जाने की कार्रवाई मिल गई, लेकिन इसकी अलग-अलग दृश्यता है। क्या स्वाइप वर्जन के समान दृश्यता के साथ उस क्रिया को करने का कोई मौका है?
गोटुका अरल

@giuseppe यह कोई फर्क नहीं पड़ता। वह स्वयं को वापस संदर्भित करके गलत नहीं है। वह प्रतिनिधि पद्धति वापस उसी तालिका दृश्य में संदर्भित कर रही है ताकि वह या तो उपयोग करने के लिए ठीक हो या।
स्टीफन पॉल

9

बस चीजों को स्पष्ट करने के लिए, जब तक tableView:commitEditingStyle:forRowAtIndexPath:लागू नहीं किया जाएगा, तब तक स्वाइप-टू-डिलीट सक्षम नहीं होगा ।

जब मैं विकास में था, मैंने इसे लागू नहीं किया, और इसलिए स्वाइप-टू-डिलीट सक्षम नहीं था। बेशक, एक तैयार ऐप में, इसे हमेशा लागू किया जाएगा, क्योंकि अन्यथा कोई संपादन नहीं होगा।


4

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

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}

3

आपको CanEditRowAt फ़ंक्शन को लागू करने की आवश्यकता है।

आप EditingStyleForRowAt फ़ंक्शन में .delete को वापस कर सकते हैं ताकि आप अभी भी संपादन मोड में हटा सकें।

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

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
    return .delete
}

2

मूल रूप से, आप विधियों का उपयोग करके संपादन सक्षम या अक्षम करते हैं

- (void)setEditing:(BOOL)editing animated:(BOOL)animated

यदि संपादन सक्षम किया गया है, तो लाल विलोपन आइकन प्रकट होता है, और उपयोगकर्ता को हटाने का अनुरोध करता है। यदि उपयोगकर्ता पुष्टि करता है, तो प्रतिनिधि विधि

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

हटाए जाने के अनुरोध की सूचना है। यदि आप इस विधि को लागू करते हैं, तो हटाने के लिए स्वाइप स्वचालित रूप से सक्रिय हो जाता है। यदि आप इस विधि को लागू नहीं करते हैं, तो हटाने के लिए स्वाइप सक्रिय नहीं है, हालांकि आप वास्तव में पंक्ति को हटाने में सक्षम नहीं हैं। इसलिए, मेरे सर्वोत्तम ज्ञान के लिए, आप तब तक नहीं प्राप्त कर सकते हैं जब तक कि आप कुछ अनैच्छिक, निजी एपीआई का उपयोग न करें। संभवतः यह है कि ऐप्पल एप्लिकेशन कैसे लागू किया जाता है।


1
मैंने इसे UITableViewCellEditingStyleDelete in tableView: editStyleForRowAtIndexPath: अगर यह संपादन मोड में है, तो वापस कर दिया।
विली

0

C # पर:

मेरे पास वही मुद्दा था जहां स्वाइप पर डिलीट ऑप्शन के साथ पंक्तियों को सक्षम / अक्षम करना आवश्यक था। बाईं ओर स्वाइप करने और हटाए जाने के लिए आवश्यक कई पंक्तियों को दूसरे रंग में रखें। मैंने इस तर्क का उपयोग करके हासिल किया।

[Export("tableView:canEditRowAtIndexPath:")]
public bool CanEditRow(UITableView tableView, NSIndexPath indexPath)
{

    if (deletedIndexes.Contains(indexPath.Row)){
        return false;
    }
    else{
        return true;
    }

}

ध्यान दें कि deleteIndexes इंडेक्स की एक सूची है जो बिना डुप्लिकेट के तालिका से हटा दी जाती है। यह कोड यह जाँचता है कि क्या कोई पंक्ति हटाई गई है, फिर वह स्वाइप या इसके विपरीत अक्षम करता है।

समकक्ष प्रतिनिधि समारोह स्विफ्ट है canEditRowAtIndexPath


0

मैं या तो इस समस्या को लेकर आया था और नीचे दिए गए कोड के साथ तय किया गया था। आशा है इससे आपकी मदद होगी।

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {

    BOOL deleteBySwipe = NO;
    for (UIGestureRecognizer* g in tableView.gestureRecognizers) {
        if (g.state == UIGestureRecognizerStateEnded) {
            deleteBySwipe = YES;
            break;
        }
    }

    if (deleteBySwipe) {
        //this gesture may cause delete unintendedly
        return;
    }
    //do delete
}

}

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