2016-12-05 6 views
0

Я студент-новичок в 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)") 
    } 
} 
+0

ошибка не происходит в коде вы публикуемый. Не связано, но результат выборки Core Data всегда является необязательным типом. Никогда не объявляйте элементы 'NSManagedObject' в массиве datasource как дополнительные. Это вызывает много ненужных вопросов или восклицательных знаков. – vadian

+0

Покажите свой запрос на выборку. – shallowThought

+0

Хорошо. Это мой запрос на выборку: –

ответ

0

Ваше ядро ​​жизни данные будет легче во всех отношениях, если вы используете NSManagedObject подклассы для юридических лиц. Это позволяет вам использовать удобные средства доступа для получения типизированных запросов на выборку и пропустить весь этот материал value(forKey: и использовать свойства.

Ошибка в том, что ваш запрос на выборку недействителен.

Возможно, вы ошибочно указали название объекта ("AlunosLista").

Это может быть расстроено, потому что тип запроса выборки, без конкретного подкласса NSManagedObject, фактически равен NSFetchRequest<NSManagedObject>.

Самого лучшего, что нужно сделать, это ввести подкласс для объекта в редакторе модели, генерировать подклассы файлов, а затем использовать это:

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

Хорошо, но как я могу вставить это, чтобы «подготовить (для segue ...)», чтобы работать правильно? То, как я это делал, используя метод выборки, не работает. Опять же, спасибо. –

+0

Это не имеет ничего общего с подготовкой к segue. В соответствии с кодом в вопросе ваша авария происходит до этого, в LoadFetch. Добавьте контрольную точку исключения, чтобы показать вам, где именно проблема. – jrturton

+0

Но когда я запускаю приложение и список в контроллере табличного представления, я правильно показываю все данные, включая параметры предиката, работающие нормально, это не говорит мне, что объект выборки (Load Fetch) в порядке? Ошибка просто падает, когда я нажимаю на ячейку, чтобы попытаться открыть деталь в контроллере следующего подробного представления. –