実現したいこと
TodoListのcellをUserDefaultsを使用して保存したい。
Swift5
1import UIKit 2 3class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 4 5 var todos:[Item] = [] 6 7 @IBOutlet weak var Table:UITableView! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view 12 Table.delegate = self 13 Table.dataSource = self 14 15 if UserDefaults.standard.object(forKey: "todoList") != nil{ 16 todos = UserDefaults.standard.object(forKey: "todoList") as! [Item] 17 } 18 } 19 20 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 21 return todos.count 22 } 23 24 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 25 26 let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 27 let item = todos[indexPath.row] 28 cell.textLabel!.text = item.title 29 return cell 30 } 31 32 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 33 return view.frame.size.height/10 34 } 35 36 @IBAction func addNewTodo(_sender: Any){ 37 var textField = UITextField() 38 39 let alert = UIAlertController(title: "新しいTodoを追加", message: "", preferredStyle: .alert) 40 41 let action = UIAlertAction(title: "リストに追加", style: .default) { (action) in 42 43 let newItem:Item = Item(title: textField.text!) 44 print("追加されました") 45 46 //UD保存 47 UserDefaults.standard.set(self.todos, forKey: "todoList") 48 49 self.todos.append(newItem) 50 self.Table.reloadData() 51 } 52 53 alert.addTextField { (alertTextField) in 54 55 alertTextField.placeholder = "新しいTodo" 56 textField = alertTextField 57 } 58 59 alert.addAction(action) 60 present(alert, animated: true,completion: nil) 61 62 } 63 64 //swipe action 65 func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { 66 67 // シェアのアクションを設定する 68 let shareAction = UIContextualAction(style: .normal , title: "share") { 69 (ctxAction, view, completionHandler) in 70 print("シェアを実行する") 71 completionHandler(true) 72 } 73 // シェアボタンのデザインを設定する 74 let shareImage = UIImage(systemName: "square.and.arrow.up")?.withTintColor(UIColor.white, renderingMode: .alwaysTemplate) 75 shareAction.image = shareImage 76 shareAction.backgroundColor = UIColor(red: 0/255, green: 125/255, blue: 255/255, alpha: 1) 77 78 // 削除のアクションを設定する 79 let deleteAction = UIContextualAction(style: .destructive, title:"delete") { 80 (ctxAction, view, completionHandler) in 81 self.todos.remove(at: indexPath.row) 82 tableView.deleteRows(at: [indexPath], with: .automatic) 83 completionHandler(true) 84 tableView.reloadData() 85 } 86 87 // スワイプでの削除を無効化して設定する 88 let swipeAction = UISwipeActionsConfiguration(actions:[deleteAction, shareAction]) 89 swipeAction.performsFirstActionWithFullSwipe = false 90 91 return swipeAction 92 } 93} 94 95struct Item{ 96 97 var title:String 98 99 init(title:String) { 100 self.title = title 101 } 102}
エラー&疑問点
cellを追加するところまでは良くて保存のコード(UD)を記入したところ
一つ目のcellは追加されるのですが、二個目以降から以下のエラー文が出ます。
Thread 1: Exception: "Attempt to insert non-property list object (\n \"SwiftTodoListTest.Item(title: \\"a\\")\"\n) for key todoList"
似たような状況になっている方の質問です
自分もItem型にtodosをcastしているので対処法や分かりやすいサイトなどを教えていただけませんか?
またUDを使用せずに保存する方法はありますか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/04 12:31