在表格视图中快速添加滑动按钮

时间:2018-08-28 03:38:52

标签: ios swift

我有一个简单的表视图,其中显示了任务列表。当用户在单元格上滑动时,我想显示两个按钮。删除按钮可删除单元格,而“已完成”按钮可将任务存储在已完成阵列中。我能够实现删除按钮,但不希望在表格单元格中显示第二个按钮。这是代码。

import UIKit

var taskArray = [String]()
var datesArray = [String]()

class ViewController: UIViewController, UITableViewDataSource
{
    @IBOutlet weak var taskTableView: UITableView!

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "taskCell", for: indexPath)
        cell.textLabel?.text = "\(indexPath.row + 1). \(taskArray[indexPath.row])"
        cell.detailTextLabel?.text = datesArray[indexPath.row]
        return cell
    }


    override func viewDidLoad()
    {
        super.viewDidLoad()
        taskTableView.dataSource = self
        let userDefaults = UserDefaults.standard
        if let task = userDefaults.stringArray(forKey: "tasks") , let date = userDefaults.stringArray(forKey: "dates")
        {
            taskArray = task
            datesArray = date
        }

        print(taskArray)
        print(datesArray)
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        taskTableView.reloadData()
    }



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

    // 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
            taskArray.remove(at: indexPath.row)
            datesArray.remove(at: indexPath.row)

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

    //function to come back from close button
    @IBAction func close(segue: UIStoryboardSegue)
    {

    }
}

5 个答案:

答案 0 :(得分:1)

Swift 4.0

您可以编写以下tableView方法来定义自定义滑动操作。

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

       let delete = UITableViewRowAction(style: .default, title: "Delete") { (action, indexPath) in

        }
        delete.backgroundColor = UIColor.red

        let complete = UITableViewRowAction(style: .default, title: "Completed") { (action, indexPath) in
            // Do you complete operation
        }
        complete.backgroundColor = UIColor.blue

        return [delete, complete]
    }

答案 1 :(得分:0)

 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 :(得分:0)

首先使此函数返回true

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

它使您的单元格可编辑,Apple提供了默认的删除和编辑选项,您可以像这样使用它:

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


    if(editingStyle == .delete)
    {
        myArray.remove(at: indexPath.item)
        table.deleteRows(at: [indexPath], with: .automatic)
        table.reloadData()

    }

}
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {

   if(studentUser as? String == "Admin")
    {
        return .delete
    }
    else
    {
        return .none
    }
}
  

或者您可以定义您的自定义名称:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]?
{
    let del = UITableViewRowAction(style: .normal, title: "Delete")
    {
        (action, index) in

        let alert = FCAlertView()
        alert.makeAlertTypeCaution()
        alert.cornerRadius = 10
        alert.delegate = self
        alert.animateAlertInFromBottom = true
        alert.animateAlertOutToTop = true
        alert.bounceAnimations = true
        alert.blurBackground = true
        alert.dismissOnOutsideTouch = true
        alert.showAlert(inView: self,
                        withTitle: "Title you want ",
                        withSubtitle: "Subtitle Comes here",
                        withCustomImage: nil,
                        withDoneButtonTitle:"OK" ,
                        andButtons:["Cancel"])
    }

    let edit = UITableViewRowAction(style: .default, title: "Edit")
    {
        (action, index) in
        self.view.makeToast("Editing Coming soon...")

    }

    del.backgroundColor = AppColor.myNewRedColor
    edit.backgroundColor = .lightGray
    return [edit,del]

}

答案 3 :(得分:0)

Swift 4.0

  1. 添加代理和数据源

    tableView.delegate = self
    tableView.dataSource = self
    
  2. 添加数据源功能“ canEditRowAt indexPath”

    //MARK: - UITableViewDataSource
    public func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    
  3. 添加代理功能“ editActionsForRowAt indexPath”

    //MARK: - UITableViewDelegate
    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    
    
        let editAction = UITableViewRowAction(style: .default, title: "Edit", handler: { (action, indexPath) in
            //Action edit
            print("Action Edit...")
        })
    
        editAction.backgroundColor = UIColor.gray //Set button color
    
        let deleteAction = UITableViewRowAction(style: .default, title: "Delete", handler: { (action, indexPath) in
            //Action delete
            print("Action Delete...")
        })
    
        return [deleteAction, editAction]
    }
    

我希望这会有所帮助。

答案 4 :(得分:0)

按照您的要求,我有。为您创建了演示。

这是输出,

enter image description here

按Delete键时,将从数组中删除元素,按Add按钮时,元素将添加到新数组中。

这是演示的链接, Tableview Demo with Swipable Add and Delete

步骤1:-连接您的Tableview数据源并在情节提要中委派。

步骤2:-编写TableView的数据源方法。

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        if section == 0 {
            return "Preloaded Data"
        } else {
            return "Added Data to New Array"
        }
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0 {
            return arrPrelodedData.count
        } else {
            return arrAddNewData.count
        }

    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard  let cell = tableView.dequeueReusableCell(withIdentifier: "SwipeToDelete", for: indexPath) as? SwipeToDelete else {return UITableViewCell()}
        if indexPath.section == 0{
            cell.lblCellContent.text = arrPrelodedData[indexPath.row] }
        else {
            cell.lblCellContent.text = arrAddNewData[indexPath.row]
        }

        return cell
    }
    //With this we can edit UITableview ex. Swipe to Delete
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        if indexPath.section == 0 {
            return true } else {
            return false
        }
    }

    //Select tableview Editing Style (insert and Delete)-> if custom icon than set None
    func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
        return UITableViewCellEditingStyle.none
    }




    //Delete Action 1) Create delete Action 2) Remove data with Indexpath 3) fetch data from coredata 4) delete tableview row 4) set delete button background color 5) return deleteAction in arry wether it is single
    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
        //Destructive Because we want to delete(destroy) the data from tableview
        let deleteAction = UITableViewRowAction(style: .destructive, title: "DELETE") { (rowAction, indexpath) in
            self.arrPrelodedData.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexpath], with: .automatic)
        }

        let addAction = UITableViewRowAction(style: .normal, title: "ADD 1") { (rowAction, indexpath) in
            self.arrAddNewData.append(self.arrPrelodedData[indexPath.row])
            tableView.reloadSections(NSIndexSet(index: 1) as IndexSet, with: .none)


           // tableView.reloadRows(at: [indexPath], with: .automatic)

        }
        deleteAction.backgroundColor = #colorLiteral(red: 1, green: 0.1491314173, blue: 0, alpha: 1)
        addAction.backgroundColor = #colorLiteral(red: 0.9176470588, green: 0.662745098, blue: 0.2666666667, alpha: 1)
        return [deleteAction,addAction]
}
}

我希望这个答案对您有所帮助。