Я студент-новичок в Swift 3, и сейчас я изучаю CoreData
. Я пытаюсь сделать приложение, где у меня есть первый контроллер, который является списком (tableviewcontroller
), где я вижу некоторых учеников. Внутри каждой ячейки у меня есть изображение (UIImage
) и 4 метки (строки: имя, наставник, примечание и дата), которые извлекают данные из массива, который хранит информацию от объекта «AlunosLista
», у которого есть один атрибут для каждого элемента (изображение - двоичные данные). Я могу добавить эту информацию через другой контроллер представления (AddDataVC.swift
) и перечислить их отлично. Приложение до сих пор прекрасно. То, что я не могу сделать, и я пытался много чего, многое, чтобы отправить данные из выбранной строки (щелкнув) на другую viewcontroller
для подробного просмотра (DetailsVC.swift
). Когда я использовал простой массив, без CoreData работал отлично. Но теперь я не могу этого сделать. Теперь части кода:CoreData: подготовиться к segue Проблема NSManagedObject в Swift 3
файла (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)")
}
}
ошибка не происходит в коде вы публикуемый. Не связано, но результат выборки Core Data всегда является необязательным типом. Никогда не объявляйте элементы 'NSManagedObject' в массиве datasource как дополнительные. Это вызывает много ненужных вопросов или восклицательных знаков. – vadian
Покажите свой запрос на выборку. – shallowThought
Хорошо. Это мой запрос на выборку: –