Reputation: 89
I am trying to run all the objects from a NSSET i have, but somehow it is getting just one. Based on my previous problem (Adding elements on many-to-many relation)
This is how i am trying to get:
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)"
}
}
}
After that i show the object name on a cell from my tableView. For explanation, my project has three entities on coremodel:
My subjects are collected by a singleton called subjectsManager who feed the enrolment, like this:
for subject in subjectsManager.subjects {
enrolment.subject = subject
student.addToStudentEnrolments(enrolment)
}
I can see that everytime i register a new student, it is adding subjects to the student correctly, but somehow when i try to show the registered subjects using the first loop, it is showing repetly a single subject twice.
This is the subject manager class:
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() {
}
}
And this is the view where i register/update students:
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 {
}
Upvotes: 0
Views: 44