Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios ';其他';语句未在';didSelectRowAt';执行时的功能_Ios_Swift_Uitableview_If Statement - Fatal编程技术网

Ios ';其他';语句未在';didSelectRowAt';执行时的功能

Ios ';其他';语句未在';didSelectRowAt';执行时的功能,ios,swift,uitableview,if-statement,Ios,Swift,Uitableview,If Statement,不知道它是否常见,但在'didSelectRowAt'函数中,'if'语句执行得很好,而'else'语句执行得不好。每当我点击单元格时,checked属性始终为true。下面是可能有帮助的代码:- 代码如下:- import UIKit import Alamofire import SwiftyJSON class TableViewController: UITableViewController { var vCData = [Item]() let url = "

不知道它是否常见,但在'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
而不是
,您的问题是因为
struct
是一个值类型,并且当您从一个变量分配到另一个变量时,会进行复制

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

解决办法很简单。在您的
if/else
之后,使用新的
selItem
更新
items

items[indexPath.row] = selfItem
另一方面,我将在
didSelectRowAt
中使用
reloadData
,替换为:

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

不需要重新加载整个表来更新一行。

在else语句中设置断点,然后查看应用程序是否达到断点。什么是
?它是类还是结构?基于您的问题,我想说它是一个结构,您正在经历值类型被复制的结果。替换
selfItem
的所有实例不是更好吗?不需要复制值。@Sweeper我不确定您的建议。如果您执行
items[indexath.row]=selfItem
,则将再次复制
selfItem
中的值。此副本是不必要的,因为您可以只编写
项[indexPath.row]
。不会进行复制。嗯,我想你可以说这是微观优化。@Sweeper是的,执行
项[indexPath.row].checked=true是另一个选项。现在出现了另一个问题,当元素的checked属性为false时,我无法从vCData中删除该元素vCData。删除“其他”块中的“不工作”