2016-12-05 71 views
0

我是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)") 
    } 
} 
+0

错误在你发布的代码不会发生。不相关,但核心数据获取的结果始终是非可选类型。永远不要将数据源数组中的NSManagedObject项声明为可选项。这会导致大量不必要的问题或感叹号。 – vadian

+0

显示您的获取请求。 – shallowThought

+0

好的。这是我的提取请求: –

回答

0

如果您为实体使用NSManagedObject子类,那么您的核心数据生命在各方面都会变得更加轻松。这使您可以使用便捷访问器来获取类型化提取请求并跳过所有这些东西并使用属性。

错误在于您的提取请求无效。

您可能错误输入了实体名称("AlunosLista")。

它可能会越来越烦躁,因为没有特定NSManagedObject子类的提取请求的类型实际上是NSFetchRequest<NSManagedObject>

做的最好的事情是进入一个子类在模型编辑器中的实体,生成子类的文件,然后使用此:

let recupoerardados: NSFetchRequest<AlunosLista> = AlunosLista.fetchRequest() 
+0

好的,但是,我如何插入这个以使“准备(for segue ...)”正常工作?我使用我的获取方法的方式不起作用。再次,谢谢。 –

+0

这与准备继续无关。根据问题中的代码,在LoadFetch中,您的崩溃正在发生。添加一个异常断点来确切地显示问题出在哪里。 – jrturton

+0

但是,当我运行应用程序和表视图控制器中的列表显示我所有的数据正确,包括谓词参数工作正常,这并不告诉我的获取对象(加载取)是好吗?当我单击单元格以尝试在下一个详细视图控制器中打开详细信息时,该错误就会崩溃。 –