2017-06-22 21 views
0

**私は良い英語のスピーカーではありません。私の厄介な英語のために私を許してください。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 
      } 
     } 
    } 
} 

(私はそれが簡単なコメントを書いてください、あなたがコードで奇妙な何かを見つけるので、もし作るために多くのことをカット)?または上記のコードをすべて変更する必要がありますか?

+0

を割り当てるための行を追加します。cellForRowAtNSManagedObject

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 } } 
  • の属性の名前に変更する必要がありますデータモデル(「タスク」インスタンス)をボタンの状態とアクションに関連付けます。最も便利な方法は 'cellForRow'の' Task'インスタンスをカスタムテーブルビューのセルに渡すことです。参照セマンティクスのため、変更は持続し、管理対象オブジェクトのコンテキストを保存するだけで済みます。実際に 'UIButton'をサブクラス化することは不幸です。 – vadian

  • +0

    @vadian私は 'UIButton'サブクラスを削除しましたが、どのように 'cellForRow'( 'cellForRowAt'を意味しましたか?)の 'Tasks'インスタンスをカスタムテーブルビューのセルに渡すことはできますか?あなたはクラス定義の代わりにマニュアル/なしを選択しなければならないということを意味しましたか?申し訳ありませんが、私はプログラミングと英語の初心者です。 – chris17

    +0

    •セルに 'var task:Tasks!'というプロパティを追加し、 'cellForRowAt'に' cell.task = task'という行を追加してください。これで、データソース項目をセルに渡しました。 • 'didSet'オブザーバを' task'に追加して 'isChecked'を現在の値に設定します。 •セルに「IBAction」を追加してタッチを受け取り、Interface Builderで接続します。 •アクションで 'isChecked'を切り替えると、' task'のイメージとプロパティを更新します。 •コンテキストを保存します。 – vadian

    答えて

    0

    シンプルなソリューション:

    • UIButtonのサブクラスを削除し、UIButtonに、ボタンのクラスを元に戻します。
    • checkedboxuncheckedboxのイメージを、selecteddefaultのボタンに割り当てます。画像は、ボタンのisSelectedプロパティに応じて自動的に表示されます。これにより、コード内の画像を完全に更新することはありません。

    • クラスCustomTableViewCellは、プロパティtaskと、ボタンのTouch Up Insideに接続する必要がありIBActionを得ました。 taskのプロパティisSelectedは、ちょうどあなたが(接続する必要がありtask

      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 
          let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CustomTableViewCell 
          let task = toDolist[indexPath.row] 
          cell.task = task 
          return cell 
      } 
      
    +0

    実際には、エンティティ 'タスク 'は属性として' isMarked'を持っていますが、それ以外は完全に機能しました!どうもありがとうございます。(申し訳ありませんが、私はこれに投票することができません。私は十分な評判がないか、そういうものがないようです。) – chris17

    関連する問題