前提・実現したいこと
Swiftでアプリを作成していますが、途中で(完了ボタンを押した時)エラーが出てしまいます。
発生している問題・エラーメッセージ
2018-05-06 21:47:14.344143+0900 timeTableApp[5738:240658] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object ( "timeTableApp.Class" ) for key TimeTable'
該当のソースコード (一部省略)
Swift
1 2import UIKit 3 4class Class { 5 let className: String 6 let roomName: String 7 let cellNumber: Int 8 9 init(className: String, roomName: String, cellNumber: Int) { 10 11 self.className = className 12 self.roomName = roomName 13 self.cellNumber = cellNumber 14 } 15} 16 17class Edit: UIViewController, UITextFieldDelegate { 18 19 @IBOutlet weak var classTextField: UITextField! 20 @IBOutlet weak var roomTextField: UITextField! 21 22 override func viewDidLoad() { 23 super.viewDidLoad() 24 25 classTextField.delegate = self 26 roomTextField.delegate = self 27 28 let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapGesture)) 29 self.view.addGestureRecognizer(tapRecognizer) 30 } 31 32 @objc func tapGesture() { 33 classTextField.resignFirstResponder() 34 roomTextField.resignFirstResponder() 35 } 36 37 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 38 classTextField.resignFirstResponder() 39 roomTextField.resignFirstResponder() 40 41 return true 42 } 43 44 45// 完了ボタンを押した時 46 @IBAction func tappedButton(_ sender: UIButton) { 47 48 let classData = Class(className:classTextField.text!, roomName: roomTextField.text!, cellNumber: ViewController.cellNumber) 49 50 ViewController.testArray.append(classData) 51 UserDefaults.standard.set(ViewController.testArray, forKey: "TimeTable") 52 UserDefaults.standard.synchronize() 53 54 print(ViewController.testArray.count) 55 56 dismiss(animated: true) {} 57 } 58 59} 60
Swift
1 2import UIKit 3 4class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 5 6 static var cellNumber: Int = 0 7 @IBOutlet weak var collectionView: UICollectionView! 8 9 static var testArray: [Class] = [] 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 collectionView.delegate = self 15 collectionView.dataSource = self 16 17 collectionView.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "CollectionViewCell") 18 } 19 20 override func viewWillAppear(_ animated: Bool) { 21 22 UserDefaults.standard.array(forKey: "TimeTable") 23 if let array: [Class] = UserDefaults.standard.array(forKey: "TimeTable") as? [Class] { 24 ViewController.testArray = array 25 print(array) 26 } else { 27 print("Error") 28 } 29 30 collectionView.reloadData() 31 } 32 33 34 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 35 36 ViewController.cellNumber = indexPath.row 37 38 if ViewController.cellNumber == indexPath.row { 39 print("セル番号:(indexPath.row)") 40 } 41 42 performSegue(withIdentifier: "Modal1", sender: self) 43 } 44 45 46 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 47 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell 48 cell.backgroundColor = UIColor.groupTableViewBackground 49 50 for data in ViewController.testArray { 51 if indexPath.row == data.cellNumber { 52 cell.classLabel.text = data.className 53 cell.roomLabel.text = data.roomName 54 } else { 55 cell.classLabel.text = "" 56 cell.roomLabel.text = "" 57 } 58 } 59 return cell 60 } 61 62} 63
試したこと
完了ボタンを押してUserDefaultsで保存する時にエラーが出ていると予想しましたが、対処法がわかりません。
ViewController.testArrayがClass型だから保存できないのでしょうか?
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/07 14:04 編集
2018/05/07 21:22
2018/05/08 09:26
2018/05/08 11:59
2018/05/09 07:28
2018/05/09 12:59
2018/05/09 13:53
2018/05/13 06:27
2018/05/13 06:50
2018/05/13 06:59
2018/05/13 07:12
2018/05/13 07:59
2018/05/13 08:09 編集
2018/05/13 09:22 編集