COREDATA:为Swift 3中的Segue NSmanagedObject问题做准备



我是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()

最新更新