我有一个数据源,其中包含不同的列表,例如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)
}
}
那么如何从这里的项目中删除正确的项目?还是有更好的方法,我不需要创建两个数据源?
答案 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]
}