0

我有一本我制作的字典,叫做场所,我让 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

4 回答 4

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()
    }

}
于 2019-07-16T05:24:30.033 回答
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")
    }
}
于 2019-07-16T05:33:08.480 回答
0

解决了:

DispatchQueue.main.async 正在创建一个不断重新加载数据的无限循环。通过删除这两个编辑功能被允许运行。我能够执行删除操作。

于 2019-07-17T22:16:33.777 回答
0

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

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

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

两个不要

  • 不要使用setValue:forKeywithUserDefaults来保存单个值。
  • 不要在类之外声明数据源数组。

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")

    }
}
于 2019-07-16T06:21:26.797 回答