如何在Swift中将复选框的状态保存到核心数据?

时间:2017-06-22 12:25:46

标签: swift xcode core-data checkbox

**我不是一个说英语的好人。请原谅我笨拙的英语。

我正在使用复选框处理待办事项列表项目。我找不到将复选框的状态保存到核心数据的方法

这是我现在使用的代码的一部分。 Tasks是实体(类定义),它有isMarked作为布尔属性。 (我为了简单而削减了很多,所以如果你在代码中发现一些奇怪的东西,请写一个评论)

import UIKit
import CoreData

var toDolist: [Tasks] = []

class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{


    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(toDoTable)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBOutlet weak var toDoTable: UITableView!

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CustomTableViewCell
        cell.box.setImage(#imageLiteral(resourceName: "uncheckedbox"), for: .normal)

        let task = toDolist[indexPath.row]

        return cell
    }

    func getData(){
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        do{
            toDolist = try context.fetch(Tasks.fetchRequest())
        }catch{
            print("fetching failed")
        }
    }

    override func viewWillAppear(_ animated: Bool) {
        getData()
        toDoTable.reloadData()
    }

}


class CustomTableViewCell: UITableViewCell {
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
    @IBOutlet weak var box: CheckBox!
    @IBOutlet weak var taskLbl: UILabel!
}

class CheckBox{
    var isChecked: Bool = false{
        didSet{
            if isChecked == true{
                self.setImage(#imageLiteral(resourceName: "checkedbox"), for: .normal)
            }else{
                self.setImage(#imageLiteral(resourceName: "uncheckedbox"), for: .normal)
            }
        }
    }

    override func awakeFromNib(){
        self.addTarget(self, action: #selector(self.buttonClicked(_:)), for: .touchUpInside)
        self.isChecked = false
    }

    func buttonClicked(_ sender: UIButton){
        if sender == self{
            if isChecked == true{
                isChecked = false
            }else{
                isChecked = true
            }
        }
    }
}

如何通过添加一些代码来解决这个问题?或者我是否必须更改上面的所有代码?

1 个答案:

答案 0 :(得分:0)

简单的解决方案:

  • 删除UIButton的子类,并将按钮的类恢复为UIButton
  • 在Interface Builder中,将图像checkedboxuncheckedbox分配给状态selecteddefault的按钮。根据按钮的isSelected属性自动显示图像。这完全避免了在代码中更新图像。

  • 课程CustomTableViewCell获得了属性task和必须连接到按钮的IBAction的{​​{1}}。必须将Touch Up Inside的属性isSelected更改为task

    的属性名称
    NSManagedObject
  • class CustomTableViewCell: UITableViewCell { @IBOutlet weak var box: UIButton! @IBOutlet weak var taskLbl: UILabel! var task : Tasks! { didSet { box.isSelected = task.isSelected taskLbl.text = // update the label } } @IBAction func buttonClicked(_ sender: UIButton) { let selected = !sender.isSelected sender.isSelected = selected task.isSelected = selected // save the context if needed } } 中,只需添加一行即可分配cellForRowAt

    task