**我不是一個好英語的人。請原諒我尷尬的英語。如何將複選框的狀態保存爲Swift中的核心數據?
我正在使用複選框來執行列表項目。我找不到將複選框的狀態保存到核心數據的方法
這是我現在使用的代碼的一部分。 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
}
}
}
}
我怎麼能加入一些代碼,它解決這個問題?或者我必須更改以上所有代碼?
必須連接(通過引用)數據模型 - 「任務」實例 - 到按鈕的狀態和操作。最方便的方法是將'cellForRow'中的'Task'實例傳遞給自定義表格視圖單元格。由於引用語義的原因,任何更改都會持續存在,您只需要保存託管對象上下文。實際上,UIButton的子類化是過度的。 – vadian
@vadian我刪除了'UIButton'的子類,但是我怎麼能在'cellForRow'(你的意思是'cellForRowAt'?)中傳遞一個'Tasks'實例到自定義tableview單元格?你的意思是我必須選擇Manual/None而不是Class Definition?對不起,但我只是編程和英語的初學者...... – chris17
•在單元格中添加屬性'var task:Tasks!',並在'cellForRowAt'中添加一行'cell.task = task'。現在您將數據源項目移交給單元格。 •將'didSet'觀察者添加到'task'以將'isChecked'設置爲當前值。 •在單元格中添加一個「IBAction」以接收觸摸並將其連接到Interface Builder中。 •在動作切換「isChecked」中,更新圖像和「任務」中的屬性。 •保存上下文。 – vadian