从数据源中删除表视图行数据

时间:2017-07-02 07:44:43

标签: ios uitableview swift3

我有一个数据源,其中包含不同的列表,例如apple notes app。 当用户点击ListViewController中的一行(所有列表)时,会出现第二个ViewController,它只保存此列表的数据。 整个数据源位于plist中,键是列表名称:

    var items = [Items]()
    var showItems = [Items]()

    func loadPlistData() {

    // Connect to plist and get the data
    if let plist = PlistHandler(name: "Items") {
        getPlist = plist.getMutablePlistDict()!

        // Load the items into the table view data source
        for i in 0..<getPlist.count {
            listItems = (getPlist.object(forKey: "Item\(i)") as! NSArray) as! [String]

            if listItems[1] != "" {
                items.append(Items(list: listItems[0], name: listItems[1], shop: listItems[2], price: listItems[3]))

                if listItems[0] == listName  {
                    showItems.append(Items(list: listItems[0], name: listItems[1], shop: listItems[2], price: listItems[3]))
                }
            }
        }
    } else {
        print("Unable to get Plist")
    }
    tableView.reloadData()
}

所以我在这里做的是将整个数据源加载到items结构中,将表视图的数据加载到showItems结构中。 当我添加一个新项目时,这将被添加到两个结构,工作正常。但是当涉及到删除时我遇到了一个问题:

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

    if editingStyle == UITableViewCellEditingStyle.delete {
        showItems.remove(at: indexPath.row)
        // Ho to delete the correct item from items here?
        // Update the plist
        itemPlistUpdate()

        tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.fade)
    }
}

那么如何从这里的项目中删除正确的项目?还是有更好的方法,我不需要创建两个数据源?

2 个答案:

答案 0 :(得分:0)

您可以使用index(where:)在项目中查找对象的索引,然后将其删除

这是一个带索引的示例代码:

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}


var people = [Person]()
people.append(Person(name: "foo"))
people.append(Person(name: "bar"))
let toDelete = Person(name: "lorem")
people.append(toDelete)
people.append(Person(name: "sic"))
people.append(Person(name: "quam"))



let index = persons.index(where: {$0 === toDelete})
print(index) // print 2

答案 1 :(得分:0)

我通过创建一个键数组和一个将在稍后编辑的项目的editKey解决了这个问题。

userID1   A
userID1   B
userID2   A

在填充showItems结构时,每个项目都会在数组的帮助下获得正确的键。

var items = [Items]()
var showItems = [Items]()
var keyArray = [Int]()
var editKey = Int()

因此表格视图将填充showItems的内容。在删除时,我使用相应的键从items结构中删除项目。

// Load the data from plist
func loadPlistData() {

    // Connect to plist and get the data
    if let plist = PlistHandler(name: "Items") {
        getPlist = plist.getMutablePlistDict()!

        // Load the items into the table view data source
        for i in 0..<getPlist.count {
            listItems = (getPlist.object(forKey: "Item\(i)") as! NSArray) as! [String]

            if listItems[0] != "" {
                items.append(Items(list: listItems[0], name: listItems[1], shop: listItems[2], price: listItems[3], remark: listItems[4]))

                if listItems[0] == listName  {
                    showItems.append(Items(list: listItems[0], name: listItems[1], shop: listItems[2], price: listItems[3], remark: listItems[4]))

                    keyArray.append(i)
                }
            }
        }
    } else {
        print("Unable to get Plist")
    }
    tableView.reloadData()
}

editKey将用于以下segue方法:

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath as IndexPath) as! ItemCell

    let myItems = showItems[indexPath.row] as Items
    cell.myItems = myItems
    return cell
}

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

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

    if editingStyle == UITableViewCellEditingStyle.delete {
        showItems.remove(at: indexPath.row)
        let key = keyArray[indexPath.row]
        items.remove(at: key)
        keyArray.remove(at: indexPath.row)
        // Update the plist
        itemPlistUpdate()

        tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.fade)
    }
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    editKey = keyArray[indexPath.row]
}