在tableView上显示NSSET数据

时间:2019-11-02 23:49:42

标签: swift core-data tableview nsset

我正在尝试使用来自CoreData的一些数据填充在ViewController上嵌入的tableView。

我的项目是关于School应用程序的,我可以在其中注册学生和科目。模型是这样设计的:

Core Data model

当我创建一个新条目时,将添加学生,这是正常方法:

@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
}

使用此方法,我在let item = itemsOnListArray[indexPath.row]行上收到错误消息“使用未解决的标识符'itemsOnListArray'”

请告诉我您是否需要更多代码部分,但是我认为这是我项目中所有重要的部分。 PS:tableView方法来自UITableViewDataSource的扩展部分,因为此tableView嵌入在ViewController中。

0 个答案:

没有答案