Я пытаюсь запустить все объекты из имеющегося у меня NSSET, но каким-то образом он получает только один. Основываясь на моей предыдущей проблеме ( Добавление элементов по отношению ко многим ко многим )
Вот как я пытаюсь получить:
if let studentEnrolments: NSSet = student.studentEnrolments {
for item in studentEnrolments {
if let enrolment = item as? Enrolment, let subjectName: String = enrolment.subject?.name {
cell.textLabel?.text = "\(subjectName)"
}
}
}
После этого я показываюимя объекта в ячейке из моего tableView. Для объяснения, у моего проекта есть три сущности на coremodel:
модель
Мои предметы собираются в одноэлементное приложение subjectManager, которое подает заявку, как здесь:
for subject in subjectsManager.subjects {
enrolment.subject = subject
student.addToStudentEnrolments(enrolment)
}
Я вижу, что каждый раз, когда я регистрирую нового ученика, он правильно добавляет предметы к ученику, но каким-то образом, когда я пытаюсь показать зарегистрированные предметы, используя первый цикл, он дважды показывает один предмет.
Это класс предметного менеджера:
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() {
}
}
И это представление, в котором я регистрирую / обновляю студентов:
import UIKit
import CoreData
class StudentsViewController: UIViewController {
// MARK: - Outlets
@IBOutlet weak var tfName: UITextField!
@IBOutlet weak var tfEmail: UITextField!
@IBOutlet weak var lbAverage: UILabel!
@IBOutlet weak var tvSubjects: UITableView!
@IBOutlet weak var lbTableTittle: UILabel!
// MARK: - Variables and Constants
var student: Student!
var enrolment: Enrolment!
var subjectsManager = SubjectsManager.shared
var total: Double = 0.0
var average: Double = 0.0
override func viewDidLoad() {
super.viewDidLoad()
if let student = student {
navigationItem.title = student.name
tfName.text = student.name
tfEmail.text = student.email
lbTableTittle.text = "Subjects and grades of \(student.name!)"
if let studentEnrolments: NSSet = student.studentEnrolments {
for item in studentEnrolments {
if let enrolment = item as? Enrolment, let subjectGrade: Double = enrolment.grade {
total += enrolment.grade
}
}
}
average = total / Double(subjectsManager.subjects.count)
lbAverage.text = String(average)
} else {
navigationItem.title = "new student"
lbTableTittle.text = "Non registred student"
lbAverage.text = "Student doenst has average yet"
}
subjectsManager.loadSubject(with: context)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tvSubjects.reloadData()
}
// MARK: - Actions
@IBAction func addEditStudent(_ sender: UIButton) {
if student == nil {
student = Student(context: context)
enrolment = Enrolment(context: context)
for subject in subjectsManager.subjects {
enrolment.subject = subject
//enrolment.grade = 0.0
student.addToStudentEnrolments(enrolment)
print("student registred on subject: \(enrolment.subject?.name) with grade \(enrolment.grade)")
}
}
student.name = tfName.text
student.email = tfEmail.text
do {
try context.save()
} catch {
print(error.localizedDescription)
}
navigationController?.popViewController(animated: true)
}
}
// MARK: - Extensions
extension StudentsViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return student != nil ? subjectsManager.subjects.count : 0
}
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 {
cell.textLabel?.text = "\(subjectName)"
}
}
}
return cell
}
extension StudentsViewController: UITableViewDelegate {
}