【问题标题】:How to add/remove an item from Core Data/Table View如何从核心数据/表格视图中添加/删除项目
【发布时间】:2018-10-06 04:04:20
【问题描述】:

简介:我是编程方面的初学者,并且正在学习 Swift 编程语言。我正在阅读这本书,并在那里坚持了一些练习/问题。尝试搜索/实施不同的方法,但没有任何帮助。

主要问题:基本上,这是一个在 Core Data 的帮助下为“书店”存储一些值的应用程序。这是来自 ViewController.swift 的代码。目前,我只有一个按钮可以添加新书,格式为“我的书”+“books.count”。

    import UIKit
import CoreData
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var deleteBook: UIBarButtonItem!   
    var managedObjectContext: NSManagedObjectContext!
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return loadBooks().count
    }   
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") else { return UITableViewCell() }
        let book: Book = loadBooks()[indexPath.row]
        cell.textLabel?.text = book.title
        return cell
    }
    func loadBooks() -> [Book] {
        let fetchRequest: NSFetchRequest<Book> = Book.fetchRequest()
        var result: [Book] = []
        do {
            result = try managedObjectContext.fetch(fetchRequest)
        } catch {
            NSLog("My error: %@", error as NSError)
        }
        return result
    }
    @IBOutlet weak var myTableView: UITableView!
    override func viewDidLoad() {
        let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
        managedObjectContext = appDelegate.persistentContainer.viewContext as NSManagedObjectContext
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }  
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    @IBOutlet weak var addNew: UIBarButtonItem!  
    @IBAction func addNew(_ sender: Any) {
        let book: Book = NSEntityDescription.insertNewObject(forEntityName: "Book", into: managedObjectContext) as! Book
        book.title = "My Book" + String(loadBooks().count)
        do {
            try managedObjectContext.save()
        } catch let error as NSError {
            NSLog("My Error: %@", error)
        }
        myTableView.reloadData()
    }
     @IBAction func deleteBook(_ sender: Any) {

}
}

所以这里有几个我正在尝试做的练习:

  1. 为应用添加新视图,允许用户输入书名
  2. 提供从列表中删除图书的方法

【问题讨论】:

  • 如果你是 Swift 和 UIKit 和 CoreData 的初学者,我建议你最好先学习基础知识。我觉得你正试图同时解决这三个问题。
  • CoreData:请好好学习基础知识,比如什么是上下文、持久化存储协调器等developer.apple.com/library/content/documentation/Cocoa/…
  • 事情是这样的——这个分步代码在一本包含所有描述的书中提供。按照这个想法 - 这应该是可以解决的,因为这本书是为绝对初学者创建的。我处理了之前的章节/练习,只停留在那些问题上。再说一遍 - 我敢肯定,解决方案非常简单,更不用说 - 编程的最佳实践 - 实际上就是写一些东西,即使你不了解所有细节并且它确实有效!
  • 删除书:managedObjectContext.performAndWait { managedObjectContext.delete(book) }如果你有时间看itunes.apple.com/podcast/developing-ios-11-apps-with-swift/…

标签: ios swift xcode uitableview core-data


【解决方案1】:

最好使用NSFetchedResultsController 来处理tableView 和coreData。欲了解更多信息以及如何配置它,请查看苹果 coreData 编程学习中的此链接:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1

【讨论】:

  • 感谢您的回答!只是为了让它更快——我应该在哪里添加这个实例(NSFetchedResultsController)只是为了让用户写一个字符串(书名)?如果你能详细回答会很高兴!
  • 像我给出的链接一样实现NSFetchedResultsController,并在您的addNew() 方法中使用let managedObjectContext = fetchResultController.managedObjectContext 作为您的managedObjectContext
  • 试图在 VievController 类之后初始化一个常量 - 让 fetchResultController:NSFetchedResultsController,在 addNew 方法中写了 let managedObjectContext=fetchResultController.managedObjectContext - 结果,我有一个错误“类 ViewController”没有初始化器。
  • 更新了一条评论,看看我的回答。
  • 您是否检查过我在上述答案中提供的链接?
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多