Search code examples
swiftuitableviewdelete-row

Remove Row From Section


This is my sectionArray

 var sectionArray = [Sections]()

This is how I figure out how many rows in section

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return sectionArray[section].items.count
}

and this is my code to remove a row by sliding.

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

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCell.EditingStyle.delete {
        sectionArray[indexPath.section].remove(at: indexPath.row)
        if sectionArray[indexPath.section].title.count == 0 {
            sectionArray.remove(at: indexPath.row)
        }
        tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
    }
}

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    
    let delete = UITableViewRowAction(style: .normal, title: "Delete") { action, index in
        //self.isEditing = false
        print("delete button tapped")
    }
    delete.backgroundColor = UIColor.red
    return [delete]
}

Theoretically this delete stuff should work but I am getting error No exact matches in call to subscript at

sectionArray[indexPath.section].remove(at: indexPath.row)

Solution

  • /// This line
    sectionArray.remove(at: indexPath.row)
    /// should be like this
    sectionArray.remove(at: indexPath.section)
    /// This line will remove the section from the table 
    tableView.deleteSections(.init(integer: indexPath.section), with: .automatic)
    
    

    You are using row to remove a section

    Edit

    Replace all the code you provided us with this

          /*
        func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
            return true
        }
        
        func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
            if editingStyle == UITableViewCell.EditingStyle.delete {
                sectionArray[indexPath.section].remove(at: indexPath.row)
                if sectionArray[indexPath.section].title.count == 0 {
                    sectionArray.remove(at: indexPath.row)
                }
                tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
            }
        }
        
        func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
            
            let delete = UITableViewRowAction(style: .normal, title: "Delete") { action, index in
                //self.isEditing = false
                print("delete button tapped")
            }
            delete.backgroundColor = UIColor.red
            return [delete]
        }
         */
        
        func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
            
            let delete = UITableViewRowAction(style: .normal, title: "Delete") { action, index in
                //self.isEditing = false
                sectionArray[indexPath.section].remove(at: indexPath.row)
                tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
                if sectionArray[indexPath.section].items.isEmpty {
                    sectionArray.remove(at: indexPath.section)
                    tableView.deleteSections(.init(integer: indexPath.section), with: .automatic)
                }
            }
            delete.backgroundColor = UIColor.red
            return [delete]
        }