'else'语句在执行时没有在'didSelectRowAt'函数中运行

时间:2018-06-09 15:11:53

标签: ios swift uitableview if-statement

不知道它是否常见但是在'didSelectRowAt'函数中,'if'语句执行得很完美但是'else'语句不是,每当我点击单元格时,checked属性总是为真,下面是可能有用的代码: -

这是代码: -

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

}

1 个答案:

答案 0 :(得分:0)

假设Itemstruct而不是class,则问题是struct是值类型并且在分配时生成副本的结果从一个变量到另一个变量。

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

修复很简单。在if/else之后,使用新的items更新selItem

items[indexPath.row] = selfItem

在不相关的说明中,我会将reloadDatadidSelectRowAt的使用替换为:

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

无需重新加载整个表只是为了更新一行。