2017-06-22 71 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

必須連接(通過引用)數據模型 - 「任務」實例 - 到按鈕的狀態和操作。最方便的方法是將'cellForRow'中的'Task'實例傳遞給自定義表格視圖單元格。由於引用語義的原因,任何更改都會持續存在,您只需要保存託管對象上下文。實際上,UIButton的子類化是過度的。 – vadian

+0

@vadian我刪除了'UIButton'的子類,但是我怎麼能在'cellForRow'(你的意思是'cellForRowAt'?)中傳遞一個'Tasks'實例到自定義tableview單元格?你的意思是我必須選擇Manual/None而不是Class Definition?對不起,但我只是編程和英語的初學者...... – chris17

+0

•在單元格中添加屬性'var task:Tasks!',並在'cellForRowAt'中添加一行'cell.task = task'。現在您將數據源項目移交給單元格。 •將'didSet'觀察者添加到'task'以將'isChecked'設置爲當前值。 •在單元格中添加一個「IBAction」以接收觸摸並將其連接到Interface Builder中。 •在動作切換「isChecked」中,更新圖像和「任務」中的屬性。 •保存上下文。 – vadian

回答

0

簡單的解決方案:

  • 刪除的UIButton子類和還原類中的按鈕來UIButton
  • 在Interface Builder中,將圖像checkedboxuncheckedbox分配給狀態爲selecteddefault的按鈕。圖像會根據按鈕的isSelected屬性自動顯示。這避免了完全更新代碼中的圖像。

  • CustomTableViewCell得到了屬性task和必須連接到按鈕的Touch Up InsideIBAction。該物業的taskisSelected必須改變的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

    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

實際上,Entity'Tasks'具有'isMarked'作爲它的屬性,但除此之外,它工作完美!非常感謝。(對不起,但我不能投票,因爲我似乎缺乏足夠的聲譽或類似的東西..) – chris17