**我不是一个说英语的好人。请原谅我笨拙的英语。
我正在使用复选框处理待办事项列表项目。我找不到将复选框的状态保存到核心数据的方法
这是我现在使用的代码的一部分。 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
}
}
}
}
如何通过添加一些代码来解决这个问题?或者我是否必须更改上面的所有代码?
答案 0 :(得分:0)
简单的解决方案:
UIButton
的子类,并将按钮的类恢复为UIButton
。在Interface Builder中,将图像checkedbox
和uncheckedbox
分配给状态selected
和default
的按钮。根据按钮的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