不知道它是否普遍,但是在'didSelectRowAt'函数中,'if'语句执行得很好,而'else'语句却不执行,并且每当我点击该单元格时,checked属性始终为true,下面的代码是可能有帮助 :-
这是代码:-
import UIKit
import Alamofire
import SwiftyJSON
class TableViewController: UITableViewController {
var vCData = [Item]()
let url = "https://api.coinmarketcap.com/v1/ticker/"
var items = [Item]()
override func viewDidLoad() {
super.viewDidLoad()
getCoinData(url: url)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
let arrayItem = items[indexPath.row]
cell.textLabel?.text = arrayItem.name
cell.detailTextLabel?.text = arrayItem.symbol
if arrayItem.checked == true{cell.accessoryType = .checkmark}
else{cell.accessoryType = .none}
return cell
}
这是发生问题的地方:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
var selItem = items[indexPath.row]
if selItem.checked == false {
selItem.checked = true
vCData.append(selItem)
}else { // statement not working
selItem.checked = false
if let index : Int = self.vCData.index(where: {$0.name == selItem.name && $0.checked == selItem.checked && $0.buyPrice == selItem.buyPrice && $0.rank == selItem.rank && $0.symbol == selItem.symbol}) {
self.vCData.remove(at: index)
print(vCData,"\n")
}
}
tableView.reloadData()
}
@IBAction func doneTapped(_ sender: UIBarButtonItem) {
self.dismiss(animated: true, completion: nil)
}
}
最佳答案
假设Item
是struct
而不是class
,那么您的问题是由于struct
是值类型,并且当您将一个变量分配给另一个变量时会产生副本。
在didSelectRowAt
中,您更新selItem
,但这不会更改存储在items
中的副本。
解决方法很简单。 if/else
之后,用新的items
更新selItem
:
items[indexPath.row] = selfItem
与此无关的是,我将
reloadData
中的didSelectRowAt
替换为:tableView.reloadRows(at: [ indexPath ], with: .fade)
无需重新加载整个表即可更新一行。