ios - 将 CoreData 实现到 TableView 时出现问题

标签 ios swift uitableview core-data

我遵循了 Apple 开发人员教程中有关实现离线数据的内容。但我想使用 CoreData。如果正确的话,我正在努力打开 CoreData 上下文并将其放入数组中。

我使用的是 Swift 3 和最新的 xCode。

这是我的实体,我不需要为单元格提取所有值,只需要显示有趣的内容:

Image

所以这是我的 book.swift,一切都基于它。

import Foundation
import CoreData
import UIKit
import os.log

public class book: NSObject, NSCoding {
var title: String
var author: String
var photo: UIImage?
var isbn: String
var publisher: String

static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("books")


struct PropertyKey {
    static let title = "title"
    static let photo = "photo"
    static let author = "author"
    static let isbn = "isbn"
    static let publisher = "publisher"
}

然后,我的 BookTableViewController

import UIKit
import os.log
import CoreData

class BookTableViewController: UITableViewController {

//MARK: Properties
var books = [book]()
var i = 0
var managedObjectContext: NSManagedObjectContext

required init(coder aDecoder: NSCoder) {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    self.managedObjectContext = appDelegate.persistentContainer.viewContext
    super.init(coder: aDecoder)!
}

override func viewDidLoad() {
    super.viewDidLoad()
    }

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "BookTableViewCell", for: indexPath) as? BookTableViewCell else {
        fatalError("some cell error")
    }
    // need help here, somehow grab the data from CoreData, or do I populate the book array from CoreData?


    let book = books[indexPath.row]

    cell.bookLabel.text = book.title
    cell.authorLabel.text = book.author
    cell.bookImageView.image = book.photo
    cell.publisherLabel.text = book.publisher

    return cell
}

我所理解的是我需要以某种方式在 cellforrowat 中打开一个循环(至少我认为)或者我是否需要以某种方式在 superviewdidload 中更早地填充数组?

我对 CoreData 做了很多研究,但仍然没有完全理解它。

最佳答案

您的book 类声明为

public class book: NSObject, NSCoding

它不是 NSManagedObject 的子类,因此您不能将它与 Core Data 一起使用。与 Core Data 一起存储的所有对象都必须是 NSManagedObject 或其子类的实例。

稍后你这样做:

let book = books[indexPath.row] as! NSManagedObject

因为 booksbook 的数组,它不是 NSManagedObject 的子类,所以肯定会失败。您不能使用 as! 将类的实例转换为 NSManagedObject。它们是完全不同的类型。

在最新版本的 Xcode 中,NSManagedObject 的子类是自动创建的。您的数据模型显示一个名为 Book 的实体,这意味着 Xcode 将自动创建一个与实体描述相匹配的类 Book。您应该使用该类而不是您创建的 book 类。使用该类,您可以从托管对象上下文中创建、保存和获取 Book 的实例。

您似乎难以理解 Core Data 的一些最基本的方面。我强烈建议查看 Apple 的 Core Data Programming Guide .它详细介绍了核心数据,包括示例代码。在您掌握基本知识之前,您将很难使用 Core Data,而该指南将帮助您做到这一点。

关于ios - 将 CoreData 实现到 TableView 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44284135/

相关文章:

ios - 如何从 UITextfields UIMenuController 中删除不需要的 UIMenuItems?

ios - 对 <ViewController> 开始/结束外观转换的不平衡调用

ios - 使 UIView 接收点击但将滑动传递给基础 View

ios - 在选择一行之前,函数无法正常工作

ios - 根据 textView 调整单元格大小不起作用?

ios - UITableView with UICollectionView in row weird scroll in different rows at the same time

ios - 在 iOS 上放大 ImageView

ios - 如何让 UIView 自动调整大小规则在 viewDidLoad 时触发?

ios - Swift:使 UIScrollView 具有 "going out of focus"效果

使用 Xcode 6 Beta 的 UITableViewCell 宽度问题 - 使用 Size Classes