Я пытаюсь заполнить встраиваемую таблицу ViewView на ViewController, которую я создал, с некоторыми данными из CoreData.
Мой проект посвящен приложению School, в котором я могу регистрировать учащихся и предметы. Модель была разработана следующим образом:
Модель базовых данных
Студенты добавляются, когда я создаю новую запись, обычный метод:
@IBAction func addEditStudent(_ sender: UIButton) {
if student == nil {
student = Student(context: context)
enrolment = Enrolment(context: context)
for subject in subjectsManager.subjects {
enrolment.subject = subject
student.addToStudentEnrolments(enrolment)
}
}
student.name = tfName.text
student.email = tfEmail.text
do {
try context.save()
} catch {
print(error.localizedDescription)
}
navigationController?.popViewController(animated: true)
}
Вы также можете увидеть, как зачисления регистрируются в цикле «для субъекта» в том же коде, приведенном выше.
Теперь для субъектов я создал для него синглтон:
import Foundation
import CoreData
class SubjectsManager {
static let shared = SubjectsManager()
var subjects: [Subject] = []
func loadSubject(with context: NSManagedObjectContext) {
let fetchRequest: NSFetchRequest<Subject> = Subject.fetchRequest()
let sortDescritor = NSSortDescriptor(key: "name", ascending: true)
fetchRequest.sortDescriptors = [sortDescritor]
do {
subjects = try context.fetch(fetchRequest)
} catch {
print(error.localizedDescription)
}
}
func deleteSubject(index: Int, context: NSManagedObjectContext) {
let subject = subjects[index]
context.delete(subject)
do {
try context.save()
subjects.remove(at: index)
} catch {
print(error.localizedDescription)
}
}
private init() {
}
}
Сейчас, вот где моя проблема, при попытке заполнить tableView (после создания студента), он не отображается должным образом. Я пытался использовать методы, чтобы сделать это, но это не работает, во-первых, из той же статьи, которую я создал, где парень отсюда помог мне:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tvSubjects.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
if let studentEnrolments: NSSet = student.studentEnrolments {
for item in studentEnrolments {
if
let enrolment = item as? Enrolment,
let subjectName: String = enrolment.subject?.name {
print("Subject name for this student is: \(subjectName)")
}
}
}
return cell
}
На этом пути, например, если у меня есть два предметаон зарегистрировал две записи, но скопировал результат (в 2 раза больше, чем первый элемент синглтона). Я предполагаю, что здесь отсутствует indexpath.row, но я пробовал много способов и все еще не работает.
Теперь это второй вариант, который я пробую, но он продолжает показывать ошибки, прежде чем я его скомпилирую:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tvSubjects.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
if let _ = student.studentEnrolments {
let itemsOnListArray = student.studentEnrolments!.allObjects
}
let item = itemsOnListArray[indexPath.row]
cell.textLabel?.text = item as? String
return cell
}
Используя это, я получаю сообщение об ошибке «Использование неразрешенного идентификатора itemsOnListArray» на let item = itemsOnListArray[indexPath.row]
строке
Пожалуйста, дайте мне знать, если вам нужно больше частей кода, но я думаю, что этоэто все важные части из моего проекта. PS: методы tableView являются частями расширений для UITableViewDataSource, поскольку этот tableView встроен в ViewController.