**私は良い英語のスピーカーではありません。私の厄介な英語のために私を許してください。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
}
}
}
}
(私はそれが簡単なコメントを書いてください、あなたがコードで奇妙な何かを見つけるので、もし作るために多くのことをカット)?または上記のコードをすべて変更する必要がありますか?
を割り当てるための行を追加します。
cellForRowAt
でNSManagedObject
の属性の名前に変更する必要がありますデータモデル(「タスク」インスタンス)をボタンの状態とアクションに関連付けます。最も便利な方法は 'cellForRow'の' Task'インスタンスをカスタムテーブルビューのセルに渡すことです。参照セマンティクスのため、変更は持続し、管理対象オブジェクトのコンテキストを保存するだけで済みます。実際に 'UIButton'をサブクラス化することは不幸です。 – vadian
@vadian私は 'UIButton'サブクラスを削除しましたが、どのように 'cellForRow'( 'cellForRowAt'を意味しましたか?)の 'Tasks'インスタンスをカスタムテーブルビューのセルに渡すことはできますか?あなたはクラス定義の代わりにマニュアル/なしを選択しなければならないということを意味しましたか?申し訳ありませんが、私はプログラミングと英語の初心者です。 – chris17
•セルに 'var task:Tasks!'というプロパティを追加し、 'cellForRowAt'に' cell.task = task'という行を追加してください。これで、データソース項目をセルに渡しました。 • 'didSet'オブザーバを' task'に追加して 'isChecked'を現在の値に設定します。 •セルに「IBAction」を追加してタッチを受け取り、Interface Builderで接続します。 •アクションで 'isChecked'を切り替えると、' task'のイメージとプロパティを更新します。 •コンテキストを保存します。 – vadian