删除行在UITableViewController中不起作用

时间:2019-07-16 05:10:31

标签: swift uitableview dictionary rowdeleting

我有一个字典,我把它叫做地方,并使tableViewController中的每个单元格显示字典的每个部分。我知道删除控制器中行的功能,但是当我运行应用程序并执行删除任何操作时,都不会发生。

// This is my entire TableViewController. I have another ViewController that appends the dictionary.
var places = [Dictionary<String,String>()]

var activePlace = -1

class TableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if UserDefaults.standard.object(forKey: "places") != nil { //checks if the list is not empty

            places = UserDefaults.standard.object(forKey: "places") as! [Dictionary<String, String>]
        }


        if places.count == 1 {

            places.remove(at: 0)

            places.append(["name":"Ex. Eiffel Tower", "lat": "48.858324", "lon": "2.294764"])

        }

    }

    // MARK: - Table view data source

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

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return places.count
    }


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

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

        DispatchQueue.main.async {

            self.tableView.reloadData()

        }

        cell.textLabel?.text = places[indexPath.row]["name"]

        return cell
    }

    override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {

        activePlace = indexPath.row

        return indexPath

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "newPlace" {

            activePlace = -1

        }

    }

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete {

            tableView.deleteRows(at: [indexPath], with: .bottom)

            places.remove(at: indexPath.row)

            UserDefaults.standard.setValue(places, forKey: "places")

        }

    }

我期望当我向左滑动时,它将删除tableView中的行和单元格的内容。然后它也会从字典中删除。

4 个答案:

答案 0 :(得分:0)

有时删除表视图单元格非常复杂。您的代码是正确的,但您只需要删除一行即可。无需调用tableview.deleteRows,您只需删除字典中的项并重新加载表视图即可。 使用canEditRowAt函数使表行可编辑。...

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

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {

        places.remove(at: indexPath.row)

        UserDefaults.standard.setValue(places, forKey: "places")

        tableView.reloadData()
    }

}

答案 1 :(得分:0)

deleteRows(at:with:)方法在remove(at:)之后移动tableView(_: commit: forRowAt:),即

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        places.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .bottom) //here...
        UserDefaults.standard.setValue(places, forKey: "places")
    }
}

答案 2 :(得分:0)

主要问题是数据源数组的声明错误。这对括号必须在括号后面

var places = [Dictionary<String,String>]()

在方法tableView(_:commit:forRowAt:中,顺序错误。首先从数据源数组中删除该行,然后删除该行。

两个不要

  • 请勿将setValue:forKeyUserDefaults一起使用以保存单个值。
  • 请勿在类外部声明数据源数组。

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {
        places.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .bottom)
        UserDefaults.standard.set(places, forKey: "places")

    }
}

答案 3 :(得分:0)

已解决:

DispatchQueue.main.async正在创建一个不断循环的不断重载数据的循环。通过删除,可以运行两个编辑功能。我能够执行删除操作。