2014-05-16 6 views
5

मेरे UITableView सुविधा सक्षम हटाने के लिए स्वाइप है रद्द नहीं करता। प्रत्येक सेल में UIButton होता है जो एक क्रिया करता है (इस मामले में, एक segue प्रदर्शन)।स्वाइप UIButton कार्रवाई

मैं उम्मीद थी कि अगर मैं बटन को स्पर्श करके सेल स्वाइप करते हैं, बटन की कार्रवाई को रद्द कर दिया जाएगा/पर ध्यान नहीं दिया, और केवल कड़ी चोट हैंडल किया जाएगा। वास्तव में क्या होता है, यह है कि दोनों इशारे (स्वाइप + टैप) का पता लगाया जाता है और संभाला जाता है।

इसका मतलब यह है कि अगर मैं सिर्फ बटन को स्पर्श करके एक कक्ष और "गलती" कड़ी चोट को हटाना चाहते हैं, एप्लिकेशन अगले स्क्रीन के लिए जाना जाएगा।

मैं इस मामले में नल की अनदेखी करने के मेरे ऐप कैसे मजबूर कर सकते हैं?

उत्तर

9

अगस्त की जवाब मेरे लिए काफी अच्छा था, लेकिन मैं समझ कैसे इसे और भी बेहतर बनाने के लिए:

जांच की जा रही है, तो तालिका संपादन मोड पर था तय करने के लिए करता है, तो बटन प्रदर्शन करना चाहिए अपनी कार्रवाई यह कर देगा व्यवहार करें, लेकिन उपयोगकर्ता अनुभव में अभी भी कोई समस्या होगी:

यदि उपयोगकर्ता संपादन मोड से बाहर निकलना चाहता है, तो उसे बटन सहित, प्राप्त करने के लिए सेल में कहीं भी टैप करने में सक्षम होना चाहिए। हालांकि, UIButton की कार्रवाई को अभी भी ऐप द्वारा विश्लेषण किया गया है, और बटन टैप करने से संपादन मोड से बाहर नहीं निकल जाएगा।

// View with tag = 1 is the UIButton in question 
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath { 
    [(UIButton *)[[tableView cellForRowAtIndexPath:indexPath] viewWithTag:1] setUserInteractionEnabled:NO]; 
} 

- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath { 
    [(UIButton *)[[tableView cellForRowAtIndexPath:indexPath] viewWithTag:1] setUserInteractionEnabled:YES]; 
} 

इस तरह, संपादन मोड में प्रवेश करने के लिए बटन की कार्रवाई ट्रिगर नहीं करेगा बटन खींच:

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

2

एक सुरुचिपूर्ण तरीके के रूप में लंबे समय से एक सेल संपादन मोड में प्रवेश किया है के रूप में बटन नल की अनदेखी करने के लिए होगा। यह काम करता है क्योंकि इशारा को हटाने के लिए स्वाइप करने से बटन टैप एक्शन लागू होने से पहले बुजुर्ग एडिटिंग RowAtIndexPath को कॉल किया जाएगा।

- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    self.isEditing = YES; 
} 

- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    self.isEditing = NO; 
} 

// button tapped 
- (IBAction)tap:(id)sender 
{ 
    if (self.isEditing) { 
     NSLog(@"Ignore it"); 
    } 
    else { 
     NSLog(@"Tap"); 
     // perform segue 
    } 
} 
+0

खैर सोचा! साथ ही, 'UITableView' पहले से ही एक संपत्ति ध्वज' संपादन' (गेटर 'isEditing') है, इसलिए एक बनाने की कोई आवश्यकता नहीं है। – Guilherme

+0

वह बहुत मददगार था! –

2

यह यह करने के लिए भी अपने सेल के उपवर्ग में संभव है:

override func setEditing(editing: Bool, animated: Bool) { 
    super.setEditing(editing, animated: animated) 

    actionButton?.userInteractionEnabled = !editing 
} 
0

मेरी समारोह एक बटन प्रेस से बुलाया जा रहा है क्योंकि मेरी मुख्य UITableViewController के वर्ग पर एक प्रतिनिधि था और एक IBAction के रूप में UITableViewCell से जुड़ा, मेरे UITableViewCell में बटन अभी भी एक स्वाइप पर गोलीबारी कर रहा था जिसमें UIButton स्वाइप के हिस्से के रूप में दबाया गया था।

इसे रोकने के लिए मैंने स्वीकार्य उत्तर के रूप में उसी UITableView प्रतिनिधियों का उपयोग किया, लेकिन संपादन होने पर निगरानी करने के लिए फ़ाइल स्तर चर सेट करना पड़ा।

// in custom UITableViewCell class 
@IBAction func displayOptions(_ sender: Any) { 
    delegate?.buttonPress() 
} 

// in UITableViewController class that implemented delegate 
fileprivate var cellSwiped: Bool = false 

func tableView(_ tableView: UITableView, willBeginEditingRowAt indexPath: IndexPath) { 
    cellSwiped = true 
} 

func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?) { 
    cellSwiped = false 
} 

func displayContactsSheet(for contact: Contact) { 
    if cellSwiped { 
     return 
    } 
    // proceed with delegate call button press actions 
}