不知道它是否普遍,但是在'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)
    }

}

最佳答案

假设Itemstruct而不是class,那么您的问题是由于struct是值类型,并且当您将一个变量分配给另一个变量时会产生副本。

didSelectRowAt中,您更新selItem,但这不会更改存储在items中的副本。

解决方法很简单。 if/else之后,用新的items更新selItem

items[indexPath.row] = selfItem


与此无关的是,我将reloadData中的didSelectRowAt替换为:

tableView.reloadRows(at: [ indexPath ], with: .fade)


无需重新加载整个表即可更新一行。

08-07 19:43