IOS 9 में स्वाइप-सक्षम टेबल व्यू सेल


83

मैं चाहता हूं कि मेरी तालिका सूची में iOS 8 (जैसे iOS 7 में पहली बार पेश किया गया) जैसे स्वाइप-सक्षम मेनू हो।

टेबल व्यू सेल एक्शन बटन का स्क्रीनशॉट

मुझे एक रे वेंडरलिच गाइड मिला है जो इसे करने के तरीके पर स्पष्ट है, लेकिन यह एक साल और 4 महीने पहले लिखा गया था और कोड ऑब्जेक्टिव-सी में है।

क्या iOS 8 या आने वाले iOS 9 में आखिरकार Apple के SDK में यह फ़ंक्शन शामिल है? मुझे पता है कि उन्होंने सालों पहले बनाया "डिलीट फील टू डिलीट फंक्शन" को बनाया। मैं iOS 8 मेल फ़ंक्शन की नकल करने के लिए पैच-एक साथ कोड लागू करने में अपना समय बर्बाद नहीं करना चाहता, अगर Apple का नया iOS इसे बड़े करीने से लपेटे हुए पैकेज में मुझे सौंपने वाला है।



2
क्या किसी को स्विफ्ट में बाएं से दाएं स्वाइप करने का कोई हल मिला है? बाएं से दाएं अच्छी तरह से प्रलेखित और चर्चा की हुई लगती है लेकिन दाएं से बाएं नहीं।
अटिकस

जवाबों:


159

इसे इस्तेमाल करे। (स्विफ्ट 3.0 के लिए अद्यतन) ( डेवलपर डॉक्स )

override func tableView(_ tableView: UITableView, editActionsForRowAt: IndexPath) -> [UITableViewRowAction]? {
    let more = UITableViewRowAction(style: .normal, title: "More") { action, index in
        print("more button tapped")
    }
    more.backgroundColor = .lightGray

    let favorite = UITableViewRowAction(style: .normal, title: "Favorite") { action, index in
        print("favorite button tapped")
    }
    favorite.backgroundColor = .orange

    let share = UITableViewRowAction(style: .normal, title: "Share") { action, index in
        print("share button tapped")
    }
    share.backgroundColor = .blue

    return [share, favorite, more]
}

इसे भी लागू करें: (आप इसे सशर्त बना सकते हैं, लेकिन यहां सब कुछ संपादन योग्य है)

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

(पुराना संस्करण)

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
        let more = UITableViewRowAction(style: .Normal, title: "More") { action, index in
            print("more button tapped")
        }
        more.backgroundColor = UIColor.lightGrayColor()

        let favorite = UITableViewRowAction(style: .Normal, title: "Favorite") { action, index in
            print("favorite button tapped")
        }
        favorite.backgroundColor = UIColor.orangeColor()

        let share = UITableViewRowAction(style: .Normal, title: "Share") { action, index in
            print("share button tapped")
        }
        share.backgroundColor = UIColor.blueColor()

        return [share, favorite, more]
    }

    func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // the cells you would like the actions to appear needs to be editable
        return true
    }

11
इस सवाल का जवाब नहीं है। हम स्विफ्ट का उपयोग करते हुए बाईं ओर स्वाइप करने का तरीका जानने की कोशिश कर रहे हैं। ऐसा नहीं है
सोमू

धन्यवाद! यह स्पष्ट रूप से बाएं-दाएं स्वाइप को हैंडल नहीं करता था, लेकिन मैंने उस फ़ंक्शन को किसी भी तरह छोड़ने का फैसला किया है। केवल एक चीज जो स्पष्ट नहीं है वह यह है कि टेबल से सेल को हटाने / हटाने वाले बटन को पुश करने के बाद टेबल को स्वचालित रूप से रिफ्रेश कैसे किया जाए?
डेव जी

1
पता नहीं अगर आपका मतलब है tableview.reloadRowsAtIndexPaths ([indexpath] withRowAnimation: UITableViewRowAnimation.Automatic)और हटाना हैtableview.deleteRowsAtIndexPaths([indexpath], withRowAnimation: UITableViewRowAnimation.Automatic)
jose920405

2
क्या सेल को स्वाइप करने के बजाय टैप करके एडिट एक्शन को खोलना संभव है?
हेयसेम काटिबी

1
स्विफ्ट 3 फ़ंक्शन की परिभाषाoverride func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]?
डेविड कॉर्बिन

28

यह कोड मेरे लिए स्विफ्ट 4 में काम कर रहा है।

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

उपरोक्त स्क्रीन का उत्तर है: -

 func tableView(_ tableView: UITableView,
                   trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
    {
        // Write action code for the trash
        let TrashAction = UIContextualAction(style: .normal, title:  "Trash", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        TrashAction.backgroundColor = .red

        // Write action code for the Flag
        let FlagAction = UIContextualAction(style: .normal, title:  "Flag", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        FlagAction.backgroundColor = .orange

        // Write action code for the More
        let MoreAction = UIContextualAction(style: .normal, title:  "More", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        MoreAction.backgroundColor = .gray


        return UISwipeActionsConfiguration(actions: [TrashAction,FlagAction,MoreAction])
    }

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

उपरोक्त स्क्रीन का उत्तर: -

 func tableView(_ tableView: UITableView,
                   leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
    {

        let closeAction = UIContextualAction(style: .normal, title:  "Mark as Read", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("CloseAction ...")
            success(true)
        })
        closeAction.backgroundColor = .blue
        return UISwipeActionsConfiguration(actions: [closeAction])

    }

इसी तरह टेबलव्यू डेलिगेट विधि लिखें: -

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrPerson.count
    }

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let personName = arrPerson[indexPath.row]
        cell.textLabel?.text = personName.personName
        return cell

    }

और व्यूडीडलड में

override func viewDidLoad() {
    super.viewDidLoad()

    tblView.delegate = self
    tblView.dataSource = self

    let person1 = personData(personName: "Jonny", personAge: 30)
    let person2 = personData(personName: "Chandan", personAge: 20)
    let person3 = personData(personName: "Gopal", personAge: 28)

   arrPerson.append(person1)
   arrPerson.append(person2)
   arrPerson.append(person3)

}

7
केवल 3 साल लगे :) जवाब देने के लिए धन्यवाद
रॉन स्रेब्रो

2
यह iOS 11+ के लिए है
cdub

21

आप उन कार्यों के लिए पूछने के लिए UITableView प्रतिनिधि पद्धति का उपयोग कर सकते हैं। इस विधि को इस प्रकार लागू करें:

- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
     UITableViewRowAction *modifyAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Modify" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
         // Respond to the action.
     }];
     modifyAction.backgroundColor = [UIColor blueColor];
     return @[modifyAction];
}

आप बेशक कई क्रियाओं को वापस कर सकते हैं और पाठ और पृष्ठभूमि के रंग को अनुकूलित कर सकते हैं।

पंक्ति को संपादन योग्य बनाने के लिए इस विधि को लागू करना भी आवश्यक है:

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

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

हां, आप केवल उस कोड के साथ सभी कार्यक्षमताओं को प्राप्त कर सकते हैं। यह बिल्ट-इन फीचर है। वाह, यह भी सही उत्तर है और किसी ने इसे वोट दिया है। मैं आश्चर्यचकित हूँ।
बैलेस्ट्रापैट्रिक

ज्ञात रहे कि यह iOS8 + के बाद से उपलब्ध है और यह केवल आपको बाईं ओर स्वाइप करने की अनुमति देता है, आपको सही स्वाइप करने के लिए कस्टम कार्यान्वयन करना होगा। इसके अलावा, त्वरित और आसान जवाब
Jiri Trecak

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

15

मुझे यह लाइब्रेरी MGSwipeTableCell मिली है। स्लाइड देखने के बाद स्लाइड सेल को कार्यान्वित करने के लिए बहुत खोज करने के बाद मैंने इसे करने के लिए कोड एक और इसकी सिर्फ एक लाइन को लागू किया और इसे अत्यंत उपयोगी पाया।

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
  {
    let reuseIdentifier = "programmaticCell"
    var cell = self.table.dequeueReusableCellWithIdentifier(reuseIdentifier) as! MGSwipeTableCell!
    if cell == nil
    {
      cell = MGSwipeTableCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: reuseIdentifier)
    }

    cell.textLabel!.text = "Title"
    cell.detailTextLabel!.text = "Detail text"
    cell.delegate = self //optional

    //configure left buttons
    cell.leftButtons = [MGSwipeButton(title: "", icon: UIImage(named:"check.png"), backgroundColor: UIColor.greenColor())
      ,MGSwipeButton(title: "", icon: UIImage(named:"fav.png"), backgroundColor: UIColor.blueColor())]
    cell.leftSwipeSettings.transition = MGSwipeTransition.Rotate3D

    //configure right buttons
    cell.rightButtons = [MGSwipeButton(title: "Delete", backgroundColor: UIColor.redColor())
      ,MGSwipeButton(title: "More",backgroundColor: UIColor.lightGrayColor())]
    cell.rightSwipeSettings.transition = MGSwipeTransition.Rotate3D

    return cell
  }

एकमात्र फ़ंक्शन जिसे आपको अपनी पॉड फ़ाइल को लागू करना और अपडेट करना होगा


11

स्विफ्ट 3 पूर्ण समाधान:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        tableView.tableFooterView = UIView(frame: CGRect.zero) //Hiding blank cells.
        tableView.separatorInset = UIEdgeInsets.zero
        tableView.dataSource = self
        tableView.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return 4
    }

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

        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)

        return cell
    }

    //Enable cell editing methods.
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

        return true
    }

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

    }

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

        let more = UITableViewRowAction(style: .normal, title: "More") { action, index in
            //self.isEditing = false
            print("more button tapped")
        }
        more.backgroundColor = UIColor.lightGray

        let favorite = UITableViewRowAction(style: .normal, title: "Favorite") { action, index in
            //self.isEditing = false
            print("favorite button tapped")
        }
        favorite.backgroundColor = UIColor.orange

        let share = UITableViewRowAction(style: .normal, title: "Share") { action, index in
            //self.isEditing = false
            print("share button tapped")
        }
        share.backgroundColor = UIColor.blue

        return [share, favorite, more]
    }

}

2

AFAIK समाधान के लिए तैयार नहीं है, और यहां तक ​​कि अगर iOS9 में था, तो आप शायद इसका उपयोग नहीं कर सकते क्योंकि आप भविष्य के लिए अपने ऐप में केवल iOS9 का समर्थन नहीं कर सकते।

इसके बजाय, मैं आपको इस पुस्तकालय को देखने की सलाह देता हूं:

https://github.com/CEWendel/SWTableViewCell

यह बहुत आसानी से विन्यास योग्य है, काफी पॉलिश है, और किसी भी स्विफ्ट परियोजना में अच्छी तरह से काम किया है जो मैंने काम किया था।

आशा करता हूँ की ये काम करेगा!


धन्यवाद। विकासशील और पहले कभी GitHub का उपयोग करने के लिए नया नहीं। मैंने सिर्फ ज़िप फ़ाइल डाउनलोड की और एक्स-कोड में प्रोजेक्ट खोला, और फिर प्रोजेक्ट चलाया लेकिन "बिल्ड फेल्ड" मिला। क्या मुझे यह देखने के लिए कोड को अपनी परियोजना में मर्ज करना होगा कि इससे पहले कि यह कैसे काम करता है?
डेव जी

आप निर्भरता प्रबंधक के रूप में कोकोपोड्स स्थापित करने से बेहतर हैं; यह उद्योग का मानक है और यह आपको बहुत सारे सिरदर्द से बचाएगा। कोको पर और अधिक प्रयोग करें और इसे यहाँ कैसे इस्तेमाल करें coccapods.org
जिरी ट्रेक

धन्यवाद गिरि, कोकोआ के बारे में संक्षेप में पढ़ने के बाद ऐसा लगता है जैसे मुझे उन्हें समझने के लिए आज रात को आगे पढ़ना होगा। मैं उत्सुक हो गया और गीथब प्रोजेक्ट चलाने के बजाय मैंने कोड देखना शुरू कर दिया। यह वस्तुनिष्ठ-सी में है! मेरा ऐप स्विफ्ट में है और यही वह भाषा है जिससे मैं परिचित हूं। क्या मुझे स्विफ्ट में गिथब के समाधान का अनुवाद करना होगा या, क्योंकि उन्हें साइड-बाय रन किया जा सकता है, क्या मैं अपने BasicCellViewController में ऑब्जेक्टिव-सी व्यूकंट्रोलर कोड को कॉपी कर पाऊंगा?
डेव जी

अगर आप iOS8 + का उपयोग कर रहे हैं, तो कोकोपोड्स के साथ, आप साइड, ऑब्जेक्टिव C और स्विफ्ट के साथ लाइब्रेरी चलाते हैं। तब आप मूल रूप से अपने स्विफ्ट प्रोजेक्ट में ओबज-सी कोड का उपयोग कर सकते हैं (लेकिन यह "पॉड्स" प्रोजेक्ट के तहत छिपा होगा), केवल एक चीज जो आपको करनी है वह है अपने "ब्रिजिंग हेडर" developer.apple.com
जिरी ट्रेक

बस CocoaPods ( raywenderlich.com/97014/use-cocoapods-with-swift ) के बारे में पढ़ा , मुझे लगता है कि मेरे दिमाग को चबाने के लिए बहुत कुछ होगा। मुझे यह अवधारणा मिलती है, लेकिन इसे टर्मिनल में लागू करने, कार्यक्षेत्रों का उपयोग करने, कोड पर मेरा ऐप चलाने से मेरे अन्य कोड के साथ विलय नहीं होता है ... साथ ही वास्तविक मेनू फ़ंक्शन को देखने / कार्य करने के लिए कैसे मैं इसे भी चाहता हूं, के लिए विलय कर रहा हूं ... मेरा मस्तिष्क विस्फोट। यह देखने के लिए कि मैं किस तरह से उस obj-c को चिपकाऊंगा और अपने ऐप को बताऊंगा कि मैं दोनों भाषाओं का उपयोग कर रहा हूं। पहले ऐसा नहीं किया गया था, लेकिन सरल लगता है
डेव जी

1

यह आपकी सोच से भी आसान है। यहां एक कार्यान्वित UITableView के साथ एक स्विफ्ट क्लास का एक उदाहरण है और UITableViewCell को स्वाइप करने की क्षमता है।

import UIKit

class ViewController: UIViewController {

    // MARK: Properties

    let strings = ["firstString", "secondString", "thirdString"]

    // MARK: Outlets

    @IBOutlet weak var tableView: UITableView!

    // MARK: Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {

    // MARK: UITableViewDataSource

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return objects.count
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath)
        let currentString = strings[indexPath.row]
        cell.textLabel?.text = currentString
        return cell
    }

    // MARK: UITableViewDelegate

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

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

        leftAction.image = UIImage(named: "")
        leftAction.backgroundColor = UIColor.red

        return UISwipeActionsConfiguration(actions: [leftAction])
    }

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

        rightAction.image = UIImage(named: "")
        rightAction.backgroundColor = UIColor.green

        return UISwipeActionsConfiguration(actions: [rightAction])
    }

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