CollectionViewのセルに編集画面で入力した値を表示させ続けたいのですが、ある1つのセルに表示させたあと違うセルに表示させると、前に表示させたセルの内容が消えてしまいます。
流れとしては、ViewControllerのCollectionViewのセルをタップ→編集画面に遷移→TextFieldに表示させたい値を入力→完了ボタンを押すと画面がViewControllerに戻り、タップしたセルのみに値が表示される。
タップしたセルの番号(cellNumber)とindexPath.rowが一致した時に値を表示させています。
値を表示させることはできるのですが、常に1つのセルしか表示させられません。
cellForRowAtの中身が間違ってるのでしょうか?
<該当コード(一部省略)>
Swift
1import UIKit 2 3class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 4 5 static var cellNumber: Int = 0 6 @IBOutlet weak var collectionView: UICollectionView! 7 8 static var testArray: [Class] = [] 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 collectionView.delegate = self 14 collectionView.dataSource = self 15 16 collectionView.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "CollectionViewCell") 17 18 } 19 20 21 override func viewWillAppear(_ animated: Bool) { 22 23// 取得 24 if let data = UserDefaults.standard.object(forKey: "TimeTable") as? Data, let array = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Class] { 25 print("取得:(array)") 26 } else { 27 print("Error") 28 } 29 30 collectionView.reloadData() 31 } 32 33 34// セルが選択された時 35 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 36 37 ViewController.cellNumber = indexPath.row 38 39 if ViewController.cellNumber == indexPath.row { 40 print("セル番号:(indexPath.row)") 41 } 42 43 performSegue(withIdentifier: "Modal1", sender: self) 44 } 45 46 47// セルの内容 48 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 49 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell 50 cell.backgroundColor = UIColor.groupTableViewBackground 51 52 for data in ViewController.testArray { 53 if indexPath.row == data.cellNumber { 54 cell.classLabel.text = data.className 55 cell.roomLabel.text = data.roomName 56 } else { 57 cell.classLabel.text = "" 58 cell.roomLabel.text = "" 59 } 60 } 61 return cell 62 }
Swift
1import UIKit 2 3class Class: NSObject, NSCoding { 4 5 6 let className: String 7 let roomName: String 8 let cellNumber: Int 9 10 init(className: String, roomName: String, cellNumber: Int) { 11 12 self.className = className 13 self.roomName = roomName 14 self.cellNumber = cellNumber 15 } 16 17 func encode(with aCoder: NSCoder) { 18 aCoder.encode(self.className, forKey: "name") 19 aCoder.encode(self.roomName, forKey: "room") 20 aCoder.encode(self.cellNumber, forKey: "number") 21 } 22 23 required init?(coder aDecoder: NSCoder) { 24 self.className = aDecoder.decodeObject(forKey: "name") as! String 25 self.roomName = aDecoder.decodeObject(forKey: "room") as! String 26 self.cellNumber = aDecoder.decodeInteger(forKey: "number") 27 } 28} 29 30class Edit: UIViewController { 31 32 @IBOutlet weak var classTextField: UITextField! 33 @IBOutlet weak var roomTextField: UITextField! 34 35 override func viewDidLoad() { 36 super.viewDidLoad() 37 38 } 39 40 41// 完了ボタンを押した時 42 @IBAction func tappedButton(_ sender: UIButton) { 43 44 let classData = Class(className:classTextField.text!, roomName: roomTextField.text!, cellNumber: ViewController.cellNumber) 45 ViewController.testArray.append(classData) 46 47// 保存 48 UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: ViewController.testArray), forKey: "TimeTable") 49 UserDefaults.standard.synchronize() 50 51 print("配列の中身:(ViewController.testArray)") 52 print("保存:(UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: ViewController.testArray), forKey: "TimeTable"))") 53 54 dismiss(animated: true) {} 55 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/09 07:27
2018/05/09 09:37
2018/05/09 09:58
2018/05/09 10:18
2018/05/09 11:23
2018/05/09 11:52
2018/05/09 12:30
2018/05/09 21:22
2018/05/09 23:18