не могу понять, почему не сохраняются данные? Есть два TableViewCotrollers. Первый динамический, в нем список элементов и pickerView для выбора группы элементов (класс - студенты). Второй TVC статичный, в нем добавляется или редактируется выбранный элемент из предыдущей таблицы. Когда возвращаюсь назад, в первую таблицу, там изменения и добавления видны. Но они не сохраняются на диск и когда приложение запускается заново, они пропадают. Более того, они пропадают даже когда подвигать колесико пикервью. Достаточно выбрать другую позицию, а потом вернуться на прежнюю, и новых данных уже нет. Пересмотрел весь код, наставил везде где только можно функцию сохранения в файл на диск. Не могу понять, где ошибка.
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)
}
}