我是Swift 3的初学者,目前我正在学习CoreData
。我试图做一个应用程序,我有第一个控制器是列表视图(tableviewcontroller
),我可以看到一些学生。在每个单元格内部,我有一个图像(UIImage
)和4个标签(字符串:名称,导师,注释和日期)从Array获取数据,该数据保存实体“AlunosLista
”中的信息,该实体具有每个项目的一个属性图像是二进制数据)。我可以通过另一个视图控制器(AddDataVC.swift
)添加这些信息并完美列出它们。该应用程序直到这里都很好。我不能做的事情,我一直在尝试很多事情,很多事情是将数据从所选行(点击)发送到另一个viewcontroller
以获取详细视图(DetailsVC.swift
)。当我使用一个简单的数组,没有CoreData时,工作正常。但现在我无法做到。现在的部分代码:CoreData:准备在Swift 3中使用NSManagedObject问题
文件(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
}
这里应该把准备(对于SEGUE),我已经尝试过很多办法。这是最后一个,谁也没有工作。 “建立成功”,但坠毁。
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)DetailViewController
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")
}
错误消息后坠毁:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'executeFetchRequest:error: is not a valid NSFetchRequest.'
我真的不知道该怎么办。我尝试了很多东西,其中一些告诉了我NSFetchedResults
,但我可以写或理解它们。如果任何人可以在这里帮助,我很感激。谢谢。
这是Fetch请求(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)")
}
}
错误在你发布的代码不会发生。不相关,但核心数据获取的结果始终是非可选类型。永远不要将数据源数组中的NSManagedObject项声明为可选项。这会导致大量不必要的问题或感叹号。 – vadian
显示您的获取请求。 – shallowThought
好的。这是我的提取请求: –