我是Swift 3的初学者,我目前正在学习CoreData
。我正在尝试执行一个应用程序,其中我有一个是列表视图(tableviewcontroller
)的控制器,我可以看到一些学生。在每个单元格内部,我有一个图像(UIImage
)和4个标签(字符串:名称,conteptor,Note和Date),他们从数组中获取数据,该数组将信息保留在实体" AlunosLista
"中,每个项目都有一个属性(图像是二进制数据)。我可以通过另一个视图控制器(AddDataVC.swift
)添加这些信息,并完美列出它们。该应用程序直到这里很好。我做不到的事情,我一直在尝试很多事情,很多事情是将数据(单击)从选择的行(单击)发送到另一个viewcontroller
以获取详细视图(DetailsVC.swift
)。当我使用一个简单的阵列时,没有Coredata,正常工作。但是现在我做不到。现在代码的一部分:
文件(1):tableViewController
class TabelaListagem: UITableViewController {....
import CoreData
import UIKit
var alunos: [NSManagedObject?] = []
var gerenciadorDeDados: NSManagedObjectContext? = nil
override func viewDidLoad() {
super.viewDidLoad()
//CORE DATA
let AppleObject = UIApplication.shared.delegate as! AppDelegate
gerenciadorDeDados = AppleObject.persistentContainer.viewContext
LoadFetch()
}
(.......)
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let path = alunos[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "celulaReuso", for: indexPath) as! ListagemCelulas
cell.lblAluno.text = path?.value(forKey: "nome") as? String
cell.lblPreceptor.text = path?.value(forKey: "preceptor") as? String
cell.lblData.text = path?.value(forKey: "dataHoje") as? String
cell.lblNotaAluno.text = path?.value(forKey: "nota") as? String
let caminhodaImagem = path?.value(forKey: "fotoAluno")
cell.imgAluno.image = UIImage(data: (caminhodaImagem as? NSData) as! Data)
return cell
}
这里应该为我尝试多种方法。这是最后一个没有工作的人。"构建成功",但崩溃了。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segueAluno" {
if let pathC = tableView.indexPathForSelectedRow{
let VCDestino = segue.destination as? DescriAluno
let objeto = FecthResultado?.object(at: pathC)
VCDestino?.alunoD = objeto as! NSManagedObject?
}
}
}
文件(2)详细信息ViewController
import UIKit
import CoreData
class DescriAluno: UIViewController {
@IBOutlet weak var imgFotoAluno: UIImageView!
@IBOutlet weak var nomeAluno: UILabel
@IBOutlet weak var txtPreceptor: UILabel!
@IBOutlet weak var txtNotaAluno: UILabel!
@IBOutlet weak var txtDataHoje: UILabel!
var gerenciadorDeDados: NSManagedObjectContext!
var alunoD: NSManagedObject?
override func viewDidLoad() {
super.viewDidLoad()
//CORE DATA
let AppleObject = UIApplication.shared.delegate as! AppDelegate
gerenciadorDeDados = AppleObject.persistentContainer.viewContext
imgFotoAluno.image = alunoD?.value(forKey: "fotoAluno")
nomeAluno.text = alunoD?.value(forKey: "nome")
txtPreceptor.text = alunoD?.value(forKey: "preceptor")
txtNotaAluno.text = alunoD?.value(forKey: "nota")
txtDataHoje.text = alunoD?.value(forKey: "dataHoje")
}
崩溃后的错误消息:
由于未被发现的例外,终止应用程序 " nsinvalidargumentException",原因:'ExecuteFetchRequest:error: 不是有效的nsfetchrequest。'
我真的不知道该如何进行。我尝试了很多事情,其中一些人告诉了NSFetchedResults
,但是我可以写或理解它们。如果有人可以在这里提供帮助,我感谢。谢谢。
这是提取请求(func):
好的。这是我的提取请求:
func LoadFecth() {
let ordenacaoAZ = NSSortDescriptor(key: "nome", ascending: true)
let ordenacaoAZPrecep = NSSortDescriptor(key: "preceptor", ascending: true)
let recupoerardados = NSFetchRequest<NSFetchRequestResult>(entityName: "AlunosLista")
recupoerardados.sortDescriptors = [ordenacaoAZPrecep, ordenacaoAZ]
do{
let recupera = try gerenciadorDeDados?.fetch(recupoerardados)
self.alunos = recupera as! [NSManagedObject]
self.tableView.reloadData()
}catch let erro as NSError{
print("Erro ao carregar: (erro.description)")
}
}
如果您使用NSManageBoct子类别为实体,您的核心数据寿命将在各个方面变得更加容易。这使您可以使用便利访问器获取输入提取请求并跳过所有这些value(forKey:
并使用属性。
错误是您的获取请求无效。
您可能已经误入了实体名称("AlunosLista"
)。
可能会感到不安,因为没有特定NSManageBject子类的获取请求的类型实际上是NSFetchRequest<NSManagedObject>
。
最好的办法是输入模型编辑器中实体的子类,生成子类文件,然后使用以下操作:
let recupoerardados: NSFetchRequest<AlunosLista> = AlunosLista.fetchRequest()