CoreData: подготовиться к поиску проблемы NSManagedObject в Swift 3
Я новичок в Swift 3 и сейчас учусь CoreData
, Я пытаюсь сделать приложение, в котором у меня есть первый контроллер, который является представлением списка (tableviewcontroller
) где я могу увидеть некоторых студентов. Внутри каждой клетки у меня есть изображение (UIImage
) и 4 метки (строки: имя, наставник, заметка и дата), которые выбирают данные из массива, который хранит информацию от объекта "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) 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")
}
Сообщение об ошибке после сбоя:
Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "executeFetchRequest: ошибка: не является допустимым 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)")
}
}
1 ответ
Ваша основная жизнь данных станет проще во всех отношениях, если вы будете использовать подклассы NSManagedObject для своих сущностей. Это позволяет вам использовать удобные средства доступа для получения типизированных запросов на выборку и пропустить все это value(forKey:
вещи и использовать свойства.
Ошибка в том, что ваш запрос на получение неверен.
Возможно, вы неправильно набрали название объекта ("AlunosLista"
).
Это может расстраивать, потому что тип запроса на выборку, без определенного подкласса NSManagedObject, на самом деле NSFetchRequest<NSManagedObject>
,
Лучше всего ввести подкласс для сущности в редакторе модели, сгенерировать файлы подкласса, а затем использовать это:
let recupoerardados: NSFetchRequest<AlunosLista> = AlunosLista.fetchRequest()