MKMapItem을 포함한 커스텀 클래스 배열 userDefaults에 저장하기

0 답변 글타래를 보이고 있습니다
  • 글쓴이
    • ygc1577
      참가자
      • 글작성 : 3
      • 답글작성 : 3

      원래 파일이

      import UIKit

      import MapKit

       

      class ViewController: UIViewController {

       

          @IBOutlet weak var tableView: UITableView!

          

          var promises = Promise{

              didSet {

                  self.savePromiseList()

                  

              }

              

          }

          

          

          override func viewDidLoad() {

              super.viewDidLoad()

              self.configureTableView()

              self.loadPromiseList()

          }

          

          

          private func configureTableView(){

              self.tableView.delegate = self

              self.tableView.dataSource = self

          }

       

       

       

          

          override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

              if let WriteCellViewController = segue.destination as? WriteCellViewController {

                  WriteCellViewController.delegate = self

                  

              }

          }

          

          private func savePromiseList(){

              let date = self.promises.map {

                  [

                      “title”: $0.title,

                      “detailcontent”: $0.detailcontent,

                      “datetime”: $0.datetime,

                      “location”: $0.location,

                      “isStar”: $0.isStar

                  ]

                  

              }

              let userDefaults = UserDefaults.standard

              userDefaults.set(date, forKey: “promises”)

          }

          

          private func loadPromiseList(){

              let userDefaults = UserDefaults.standard

              guard let data = userDefaults.object(forKey: “promises”) as? [[String: Any]] else { return }

              self.promises = data.compactMap{

                  guard let title = $0[“title”] as? String else { return nil }

                  guard let detailcontent = $0[“detailcontent”] as? String else { return nil }

                  guard let date = $0[“datetime”] as? Date else { return nil }

                  guard let location = $0[“location”] as? MKMapItem else { return nil }

                  guard let isStar = $0[“isStar”] as? Bool else { return nil }

                  return Promise(title: title, detailcontent: detailcontent, datetime: date, location: location, isStar: isStar)

              }

          }

              

       

           

              

          

          

          private func dateToString(date: Date) -> String {

              

              let formatter = DateFormatter()

              formatter.dateFormat = “yy년 MM월 dd일(EEEEE)”

              formatter.locale = Locale(identifier: “ko-KR”)

              return formatter.string(from: date)

          }

          

      }

       

       

       

      extension ViewController: UITableViewDelegate {

          

          

          

          

          

      }

       

       

       

       

      extension ViewController: UITableViewDataSource {

          func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

              return self.promises.count

          }

          

          func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

              guard let customcell = tableView.dequeueReusableCell(withIdentifier: “Cell”, for: indexPath) as? CustomCell else {return UITableViewCell() }

              let promise = self.promises[indexPath.row]

              customcell.title.text = promise.title

              customcell.location.text = promise.location.name

              customcell.datetime.text = self.dateToString(date: promise.datetime)

              

       

              return customcell

          }

          

      }

       

      extension ViewController: WriteCellViewDelegate {

          func didSelectRegister(promise: Promise) {

              self.promises.append(promise)

              self.tableView.reloadData()

          }

          

          

      }

       

      이녀석 입니다. 즉 다음 화면인 tableview cell 입력란에서 정보를 받아와

      이를 현재 화면에 Cell로 나타내는 형태인데

      custom class 배열의 요소로 location 변수가 MKMapItem 타입이라서 제대로 구동하지 않습니다

      그래서 NSkeyedUnArchiever를 써야한다는 건 알겠는데

      이를 어떤 형태로 지금의 코드에 적용해야 할지 모르겠습니다

      아래는 커스텀 클래스 파일입니다

       

      //  Promise.swift

      //  waudiya

      //

      //  Created by mac on 2022/08/06.

      //

       

      import Foundation

      import MapKit

      class Promise: NSObject, NSCoding {

          var title: String

          var detailcontent: String

          var datetime: Date

          var location: MKMapItem

          var isStar: Bool

          

          

          init(title aTitle : String, detailcontent aDetailcontent : String, datetime aDatetime : Date, location aLocation : MKMapItem, isStar aIsstar : Bool) {

                 self.title = aTitle

                 self.detailcontent = aDetailcontent

                 self.datetime = aDatetime

                 self.location = aLocation

                 self.isStar = aIsstar

             }

             

             //NSCoding Protocol 구현

             

             required init?(coder: NSCoder) {

                 self.title = coder.decodeObject(forKey: “title”) as! String

                 self.detailcontent = coder.decodeObject(forKey: “detailcontent”) as! String

                 self.datetime = coder.decodeObject(forKey: “datetime”) as! Date

                 self.location = coder.decodeObject(forKey: “location”) as! MKMapItem

                 self.isStar = coder.decodeObject(forKey: “isStar”) as! Bool

             }

             

             func encode(with coder: NSCoder) {

                 coder.encode(self.title, forKey: “title”)

                 coder.encode(self.detailcontent, forKey: “detailcontent”)

                 coder.encode(self.datetime, forKey: “datetime”)

                 coder.encode(self.location, forKey: “location”)

                 coder.encode(self.isStar, forKey: “isStar”)

             }

        

          

          

      }

       

       

      제가 어색하게 나마 고쳐보았지만 Thread 1: signal SIGABRT 오류가 뜨며 계속 멈추네요

      도대체 어떻게 해야 할까요?

      제발 도와주세요

0 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 260-27-00477
통신판매업 신고번호 : 제 2020-충북청주-0663 호
고객센터 : 카카오톡채널 @yagom