ios - didSelectRowAt 不影响 cellForRowAt

标签 ios swift uitableview

我试图在按下 UITabelViewCell 时获得不同的标签文本,但我无法让它工作。 completed 的默认值为 false,触摸时应为 true,然后应更改标签。在 didSelectRowAt 中,completed 值不同,所以很好,但我无法将它传递给 cellForRowAt。

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var listItems : [ListItem] = []

    @IBOutlet weak var plusButton: UIButton!
    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
    //...
    }


    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listItems.count
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        var item = listItems[indexPath.row]

        item.completed = !item.completed // changing from true to false and rom false to true
        tableView.reloadData()
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? CellData{
            let item = listItems[indexPath.row]
            cell.nameLabel.text = item.name
            cell.userLabel.text = item.addedBy

            if(item.completed == true){ //didSelectRowAt doesn't affect this item.completed
                cell.doneLabel.text = "done"
            } else {
                cell.doneLabel.text = "not"
            }
            return cell
        } else{
            return CellData()
        }
    }
}

ListItem.swift:

struct ListItem{
    var name : String!
    var addedBy : String!
    var completed : Bool!

    init(name: String, addedBy: String, completed: Bool){
        self.name = name
        self.addedBy = addedBy
        self.completed = completed
    }

}

最佳答案

当您更新 ListItem 时,它是一个结构,它不会在列表中更新,因为结构总是被复制。 我认为你应该做类似的事情:

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  var item = listItems[indexPath.row]
  item.completed = !item.completed //
  listItems[indexPath.row] = item
   tableView.reloadData()
 }

关于ios - didSelectRowAt 不影响 cellForRowAt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42076459/

相关文章:

ios - 将对象保存到核心数据中

ios - UIButton 标题问题

iOS 主细节秒

iphone - 如何最小化iPhone中点击按钮时的应用程序?

ios - AdMob 中介奖励视频广告 Error Domain=com.google.ads Code=9 没有从任何广告服务器返回的广告

ios - swift 3/ Alamofire 4 : Fetching data with the ID on a TableView

ios - 将 heic 转换为 JPG 并获取文件位置

swift - didFinishPickingMediaWithInfo 是否根据不同的发件人执行不同的操作

ios - 添加额外的解析登录字段

ios - UITableViewCell 在滚动后被复制