【问题标题】:Swift - save tableviewcells with checked buttons on "Apply" button clickSwift - 在“应用”按钮单击时保存带有选中按钮的表格视图单元
【发布时间】:2020-07-15 08:55:25
【问题描述】:

我在 tableview 中显示饮料的类别。在每个单元格中显示类别名称并有一个复选框按钮。在按钮单击复选框图像从“选中图像”更改为“未选中图像”。

我想区分当用户按下“应用”按钮时哪些单元格显示了“已检查图像”。然后从每个选定的单元格(其按钮显示“已检查图像”图像的单元格)中获取 categoryLabel 并将它们保存在数组中。

复选框类:

   class CheckBox: UIButton
  {
    override func awakeFromNib()
    {
        let checkedImage = UIImage(named: "checked-image")! as UIImage
        let uncheckedImage = UIImage(named: "unchecked-image")! as UIImage
        
        self.setImage(uncheckedImage, for: .normal)
        self.setImage(checkedImage, for: .selected)

        self.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
        self.isSelected = true
    }
    
    @objc func buttonClicked(sender: UIButton)
    {
        if sender == self {

                   sender.isSelected = !sender.isSelected
        }
    }
}

表格视图:

class FilterViewController: UIViewController {

    var categories = [Category]()
    
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var applyButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        getCategories()
    }
    
    @IBAction func applyButtonClicked(_ sender: UIButton) {
        print("Filter applied") 
        // save checked buttons 
    }
    
    func getCategories() {
        let url = URL(string: "https://www.thecocktaildb.com/api/json/v1/1/list.php?c=list")
        
        URLSession.shared.dataTask(with: url!) { (data, response, error) in
            
            if error == nil {
                do {
                    self.categories = try JSONDecoder().decode(Categories.self, from: data!).drinks
                    
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                } catch {
                    print(error)
                }
            }
        }.resume()
    }

}

extension FilterViewController: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return categories.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "categoryCell", for: indexPath) as! CategoryCell
        
        cell.categoryLabel.text = categories[indexPath.row].strCategory
        cell.styleButton()
        
        return cell
    }
}

类别模型:

struct Categories:Decodable {
    var drinks: [Category]
}

struct Category:Decodable {
    var strCategory: String
}

饮料模型:

struct Response:Decodable {
    var drinks: [Drink]
}

struct Drink:Decodable {
    var strDrink: String
    var strDrinkThumb: String
}

类别单元格:

class CategoryCell: UITableViewCell {

    @IBOutlet weak var categoryLabel: UILabel!
    @IBOutlet weak var checkBoxButton: CheckBox!
    
}

我的应用:

【问题讨论】:

  • 您是否在问如何在应用启动之间保留用户数据/选择?
  • 我想区分当用户按下“应用”按钮时哪些单元格显示了“已检查图像”。然后从每个选定的单元格中获取 categoryLabel 并将它们保存在数组中。

标签: ios swift uitableview button checkbox


【解决方案1】:

请尝试以下代码:

复选框类:

 class CheckBox: UIButton
 {
    override func awakeFromNib()
    {
        let checkedImage = UIImage(named: "checked-image")! as UIImage
        let uncheckedImage = UIImage(named: "unchecked-image")! as UIImage
        
        self.setImage(uncheckedImage, for: .normal)
        self.setImage(checkedImage, for: .selected)
        
        self.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
        self.isSelected = true
    }
    
    @objc func buttonClicked(sender: UIButton)
    {
        if sender == self {
            
            sender.isSelected = !sender.isSelected
        }
    }
 }

表格视图类:

class FilterViewController: UIViewController
{

    var categories = [Category]()
    var selectedCategories = [String]()
    var selectedCategories : NSMutableArray = NSMutableArray()

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var applyButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        getCategories()
    }
    
  @IBAction func applyButtonClicked(_ sender: UIButton) {
      print("Filter applied")
      // save checked buttons
    print("Selected Categories =", selectedCategories)
  }
    
    func getCategories() {
        let url = URL(string: "https://www.thecocktaildb.com/api/json/v1/1/list.php?c=list")
        
        URLSession.shared.dataTask(with: url!) { (data, response, error) in
            
            if error == nil {
                do {
                    self.categories = try JSONDecoder().decode(Categories.self, from: data!).drinks
                    
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                } catch {
                    print(error)
                }
            }
        }.resume()
    }

    }
    
    extension FilterViewController: UITableViewDelegate, UITableViewDataSource
     {
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return categories.count
        }
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            
            let cell = tableView.dequeueReusableCell(withIdentifier: "categoryCell", for: indexPath) as! CategoryCell
            
            cell.categoryLabel.text = categories[indexPath.row].strCategory
            cell.styleButton()
            
            return cell
        }
    
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
        {
            if selectedCategories.contains(categories[indexPath.row].strCategory) {
                selectedCategories.remove(categories[indexPath.row].strCategory)
            }else{
                selectedCategories.add(categories[indexPath.row].strCategory)
            }
        }
    }

【讨论】:

  • 它不保存显示“已检查图像”的单元格,而是保存点击的单元格
  • 好的,您如何选择选中的单元格或带有“已选中图像”的单元格?另外,你能分享一下 cell.styleButton() 代码吗?
【解决方案2】:

像这样重新排列你的代码..

import UIKit

struct Categories: Codable {
    let drinks: [Drink]
}
// MARK: - Drink
struct Drink: Codable {
    let strCategory: String
}
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UIGestureRecognizerDelegate{
    @IBOutlet weak var tableView: UITableView!
    
    @IBOutlet weak var btnDone: UIButton!
    var datas = [[String : Any]]()
    var category = [Drink]()
    override func viewDidLoad() {
        super.viewDidLoad()
       
        self.getCategories()

    }

    func getCategories() {
        let url = URL(string: "https://www.thecocktaildb.com/api/json/v1/1/list.php?c=list")
        
        URLSession.shared.dataTask(with: url!) { (data, response, error) in
            
            if error == nil {
                do {
                    self.category = try JSONDecoder().decode(Categories.self, from: data!).drinks
                    for i in 0..<self.category.count
                    {
                        self.datas.append(["name":self.category[i].strCategory, "status":"0"])
                    }
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                } catch {
                    print(error)
                }
            }
        }.resume()
    }
    
    @IBAction func btnDone(_ sender: Any) {
        var selectedCatgry = [String]()
        for i in 0..<datas.count
        {
            let rowVal = datas[i]
            if rowVal["status"] as! String == "1"{
                selectedCatgry.append(rowVal["name"] as! String)
            }
        }
        print(selectedCatgry)
    }
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return datas.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! cell
        
            let val = datas[indexPath.row]
            cell.descriptionName.text = (val["name"] as! String)
            if (val["status"] as! String) == "1"{
                cell.btnSelect.setImage(UIImage(systemName: "circle.fill"), for: .normal)
            }else{
                cell.btnSelect.setImage(UIImage(systemName: "circle"), for: .normal)
            }
            cell.btnSelect.addTarget(self, action: #selector(subscribeTapped(_:)), for: .touchUpInside)
        cell.btnSelect.tag = indexPath.row
        return cell
    }
    
    
    @objc func subscribeTapped(_ sender: UIButton){
        var sel = datas[sender.tag]
        datas.remove(at: sender.tag)
        if sel["status"] as! String == "1"{
            sel.updateValue("0", forKey: "status")
        }else{
            sel.updateValue("1", forKey: "status")
        }
        datas.insert(sel, at: sender.tag)
        tableView.reloadData()
    }
}
    class cell: UITableViewCell {
     
        @IBOutlet weak var btnSelect: UIButton!
        @IBOutlet weak var descriptionName: UILabel!
        
    }

【讨论】:

  • 做了几个修复,它的工作原理!非常感谢!!
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
相关资源
最近更新 更多