I'm a beginner, please help me to understand why it happens?
I have two TableViewCotrollers - dynamic and static. When I add or edit item in static TVC it pass to the dynamis TVC. This data is visible in the table. But after that it is not saved. When i open the app again these changes are missing and if I roll the wheel of the pickerView these changes disappear.
I put the function of saving to file on disk wherever possible, but it still does not work. What is my mistake?
TVC 1 - Dynamic
import UIKit class StudentsTableViewController: UITableViewController, UIPickerViewDataSource, UIPickerViewDelegate { @IBOutlet weak var pickerViewStudents: UIPickerView! var classesObject = [ClassUnit]() var classSelected: String = "" var studentsSelected: [String] = [] { didSet { tableView.reloadData() } } override func viewDidLoad() { super.viewDidLoad() self.pickerViewStudents.delegate = self self.pickerViewStudents.dataSource = self classesObject = ClassUnit.loadFromFile() navigationItem.leftBarButtonItem = editButtonItem } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return classesObject.count } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { classesObject = ClassUnit.loadFromFile() return classesObject[row].classTitle } override func viewWillAppear(_ animated: Bool) { classesObject = ClassUnit.loadFromFile() pickerViewStudents.reloadAllComponents() tableView.reloadData() } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { classSelected = classesObject[row].classTitle studentsSelected = classesObject[row].classStudents ClassUnit.saveToFile(classes: classesObject) } // MARK: - Table view data source// override func numberOfSections(in tableView: UITableView) -> Int { return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return studentsSelected.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ClassTitleStudents", for: indexPath) cell.textLabel?.text = studentsSelected[indexPath.row] cell.showsReorderControl = true ClassUnit.saveToFile(classes: classesObject) return cell } override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle { return .delete } override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { studentsSelected.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: .automatic) ClassUnit.saveToFile(classes: classesObject) } } override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { let moveStudent = studentsSelected.remove(at: fromIndexPath.row) studentsSelected.insert(moveStudent, at: to.row) tableView.reloadData() ClassUnit.saveToFile(classes: classesObject) } // MARK: - Navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "EditStudentSegue" { let indexPath = tableView.indexPathForSelectedRow! let student = studentsSelected[indexPath.row] let nav = segue.destination as! UINavigationController let editStudentName = nav.topViewController as! AddEditStudentTableViewController editStudentName.student = student ClassUnit.saveToFile(classes: classesObject) } } @IBAction func unwindToStudentsTableView(segue: UIStoryboardSegue) { guard segue.identifier == "saveUnwindStudents" else { return } let sourceViewController = segue.source as! AddEditStudentTableViewController let student = sourceViewController.student if let selectedIndexPath = tableView.indexPathForSelectedRow { studentsSelected[selectedIndexPath.row] = student tableView.reloadRows(at: [selectedIndexPath], with: .none) ClassUnit.saveToFile(classes: classesObject) } else { let newIndexPath = IndexPath(row: studentsSelected.count, section: 0) studentsSelected.append(student) //tableView.insertRows(at: [newIndexPath], with: .automatic) ClassUnit.saveToFile(classes: classesObject) } } }
TVC 2 - Static
import UIKit class AddEditStudentTableViewController: UITableViewController { @IBOutlet weak var nameStudent: UITextField! @IBOutlet weak var saveButton: UIBarButtonItem! var classesObject = [ClassUnit]() var student = "" override func viewDidLoad() { super.viewDidLoad() nameStudent.text = student updateSveButton() classesObject = ClassUnit.loadFromFile() } func updateSveButton() { let nameOfStudent = nameStudent.text ?? "" saveButton.isEnabled = !nameOfStudent.isEmpty ClassUnit.saveToFile(classes: classesObject) } @IBAction func textEditingChanged(_ sender: UITextField) { updateSveButton() } // MARK: - Navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "saveUnwindStudents" else { return } let nameOfStudent = nameStudent.text ?? "" student = nameOfStudent ClassUnit.saveToFile(classes: classesObject) } }