Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change colour of swipe-to-delete background in Swift

I have been trying to change the colour of the background of the swipe to delete button in my tableview. I took a look at some Objective-C examples but I haven't been able to translate them into Swift.

This is my code at the moment:

    var cellDeleteBackground = UIView()
    cellDeleteBackground.backgroundColor = UIColor.greenColor()
    cell.editingAccessoryView = cellDeleteBackground

I have this in cellForRowAtIndexPath but at the moment it is crashing with error 'terminating with uncaught exception of type NSException'

Could this code be interfering?

    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    if tableView == self.searchDisplayController?.searchResultsTableView {
        return false
    } else {
        return true
    }
}

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if (editingStyle == UITableViewCellEditingStyle.Delete) {
            if tableView == self.searchDisplayController?.searchResultsTableView {
                UITableViewCellEditingStyle.None
            } else {
            var valueToRemove: AnyObject! = unformatted.objectAtIndex(indexPath.row)

            if images.objectAtIndex(indexPath.row) as NSObject == 0 {
                totalSpendingsCounter = totalSpendingsCounter - Double(valueToRemove as NSNumber)
                NSUserDefaults.standardUserDefaults().setDouble(totalSpendingsCounter, forKey: "spendingsCounter")
            } else if images.objectAtIndex(indexPath.row) as NSObject == 1 {
                totalCreditCounter = totalCreditCounter - Double(valueToRemove as NSNumber)
                NSUserDefaults.standardUserDefaults().setDouble(totalCreditCounter, forKey: "creditCounter")
            }

            currencyDouble = NSUserDefaults.standardUserDefaults().doubleForKey("currencyCounter")
            currentBudgetCalculation = currencyDouble + totalCreditCounter - totalSpendingsCounter

            newTransactionEntered = true

            var formatter = NSNumberFormatter()
            formatter.numberStyle = .CurrencyStyle
            formatter.locale = NSLocale.currentLocale() // This is the default
            var formattedNumberCurrent = formatter.stringFromNumber(currentBudgetCalculation)

            var defaults = NSUserDefaults(suiteName: "group.AffordIt")
            defaults.setObject(formattedNumberCurrent, forKey: "currentBudgetWidget")
            defaults.setObject(newTransactionEntered, forKey: "new")

            values.removeObjectAtIndex(indexPath.row)
            images.removeObjectAtIndex(indexPath.row)
            names.removeObjectAtIndex(indexPath.row)
            dates.removeObjectAtIndex(indexPath.row)
            unformatted.removeObjectAtIndex(indexPath.row)
            notes.removeObjectAtIndex(indexPath.row)

            NSUserDefaults.standardUserDefaults().setObject(names, forKey: "names")
            NSUserDefaults.standardUserDefaults().setObject(values, forKey: "values")
            NSUserDefaults.standardUserDefaults().setObject(dates, forKey: "dates")
            NSUserDefaults.standardUserDefaults().setObject(unformatted, forKey: "unformatted")
            NSUserDefaults.standardUserDefaults().setObject(images, forKey: "images")
            NSUserDefaults.standardUserDefaults().setObject(notes, forKey: "notes")

            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        }
    }
}
like image 554
user3746428 Avatar asked Oct 13 '14 10:10

user3746428


3 Answers

This is how you can customise swipe-to-delete in iOS8:

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? {
    var deleteButton = UITableViewRowAction(style: .Default, title: "Delete", handler: { (action, indexPath) in
        self.tableView.dataSource?.tableView?(
            self.tableView,
            commitEditingStyle: .Delete,
            forRowAtIndexPath: indexPath
        )

        return
    })

    deleteButton.backgroundColor = UIColor.blackColor()

    return [deleteButton]
}
like image 134
Kirsteins Avatar answered Oct 20 '22 18:10

Kirsteins


Below the code updated for Swift 4, Xcode 9:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let deleteButton = UITableViewRowAction(style: .default, title: "Delete") { (action, indexPath) in
        self.tableView.dataSource?.tableView!(self.tableView, commit: .delete, forRowAt: indexPath)
        return
    }
    deleteButton.backgroundColor = UIColor.black
    return [deleteButton]
}
like image 32
David de Tena Avatar answered Oct 20 '22 19:10

David de Tena


Custom swipe to delete (background colour as black) for iOS 14 as UITableViewRowAction is deprecated this uses UIContextualAction, I couldn't find a good example.

  override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
     
    let delete = UIContextualAction(style: .destructive, title: "Delete") { [self] (action, view, completion) in
        
        if indexPath.row == 0 {
            
            deleteGoalCell(indexPath: indexPath)
            
            goals.remove(at: indexPath.section)
            
            let indexSet = IndexSet(arrayLiteral: indexPath.section)
            
            tableView.deleteSections(indexSet, with: .fade)

        } else {
            
            deleteTaskcell(indexPath: indexPath)
            
            tableView.deleteRows(at: [indexPath], with: .fade)
            
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
                self.tableView.reloadData()
            }
            
        }
        
            completion(true)
        }
    
        delete.backgroundColor = UIColor.black
     
        let config = UISwipeActionsConfiguration(actions: [delete])
        config.performsFirstActionWithFullSwipe = false
     
        return config
    }
like image 1
jat Avatar answered Oct 20 '22 17:10

jat