Отображение данных NSSET в tableView - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь заполнить встраиваемую таблицу 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.

...