我正在尝试使用来自CoreData的一些数据填充在ViewController上嵌入的tableView。
我的项目是关于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
}
使用此方法,我在let item = itemsOnListArray[indexPath.row]
行上收到错误消息“使用未解决的标识符'itemsOnListArray'”
请告诉我您是否需要更多代码部分,但是我认为这是我项目中所有重要的部分。 PS:tableView方法来自UITableViewDataSource的扩展部分,因为此tableView嵌入在ViewController中。