如何在加载了 JSON API 数据的 tableview 单元格中保存复选标记属性?

Posted

技术标签:

【中文标题】如何在加载了 JSON API 数据的 tableview 单元格中保存复选标记属性?【英文标题】:How to save checkmark property in tableview cells which have JSON API data loaded? 【发布时间】:2018-03-26 16:46:52 【问题描述】:

我知道在手动将数据添加到数组时如何保存复选标记。我只是不知道当数据与 API 同步时如何保存单元格的复选标记属性。

这是我的代码:

class TableViewController: UITableViewController 

    let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("Items.plist")
    var fetchCoinInfo = [[String: AnyObject]]()
    let url = "https://api.coinmarketcap.com/v1/ticker/"

    override func viewDidLoad() 
        super.viewDidLoad()
        getCoinData(url: url)
        self.tableView.reloadData()
    

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int 
        // #warning Incomplete implementation, return the number of sections
        return 1
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        // #warning Incomplete implementation, return the number of rows
        return fetchCoinInfo.count
    


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        cell.textLabel?.text = fetchCoinInfo[indexPath.row]["name"] as? String
        cell.detailTextLabel?.text = fetchCoinInfo[indexPath.row]["symbol"] as? String

        return cell

    

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

        tableView.deselectRow(at: indexPath, animated: true)
            let cell = tableView.cellForRow(at: indexPath)
        if cell?.accessoryType == .checkmark 
            cell?.accessoryType = .none
        else 
            cell?.accessoryType = .checkmark
        

    

    func getCoinData(url: String) 

        // Alamofire parsing code:
        Alamofire.request(url, method: .get)
            .responseJSON  response in
                if response.result.isSuccess 

                    print("Sucess! Got the data")
                    let coinJSON : JSON = JSON(response.result.value!)
                    print(coinJSON)
                   self.updateCoinData(json: coinJSON)

                 else 
                    print("Error: \(String(describing: response.result.error))")
            
        
        self.tableView.reloadData()
    

    // SwiftyJSON code:

    func updateCoinData(json : JSON) 

        if let coinSymbol = json[].arrayObject 
            print(coinSymbol)

            self.fetchCoinInfo = coinSymbol as! [[String: AnyObject]]
        
        else 
            print("cannot connect to the server")
        
        self.tableView.reloadData()
    

【问题讨论】:

【参考方案1】:

请向您的本地 JSON 对象添加一个新键,其状态为复选标记,并在 didSelect 上更新它。您还需要在 cellForRowAtIndexPath 中设置附件视图

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

    var info = fetchCoinInfo[indexPath.row]
    cell.textLabel?.text = info["name"] as? String
    cell.detailTextLabel?.text = info["symbol"] as? String

    if let checked = info["checked"] as? Bool, checked == true 
        cell?.accessoryType = .checkmark
    else 
        cell?.accessoryType = .none
        info["checked"] = false
    

    return cell



override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

    tableView.deselectRow(at: indexPath, animated: true)
    let cell = tableView.cellForRow(at: indexPath)
    var info = fetchCoinInfo[indexPath.row]
    if cell?.accessoryType == .checkmark 
        cell?.accessoryType = .none
        info["checked"] = false
    else 
        cell?.accessoryType = .checkmark
        info["checked"] = true
    


【讨论】:

以上是关于如何在加载了 JSON API 数据的 tableview 单元格中保存复选标记属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JSON 文件加载 React-Table 中的图像

如何将 JSON 数据加载到 Bootstrap 表中?

如何从VUE中的另一个API加载其他JSON数据?

el-table数据转化为json后如何转换

如何在 Swift 中重新加载来自外部 API 的折线图数据?

如何在yii2 restful api中将两个表中的关系数据显示为json格式