gpt4 book ai didi

swift - 在 NSTableView 中显示和使用核心数据

转载 作者:行者123 更新时间:2023-11-28 05:56:02 36 4
gpt4 key购买 nike

背景:几周来我一直在自学 Swift、iOS 和 macOS,我一直在尝试为 macOS 构建一个“价格计算器”,它可以从纸质数据库中获取并使用选定的属性来选择一张纸。用户将能够从属性列表中进行选择,例如:尺寸、重量、表面处理、颜色和品牌。从那里,它将使用一般算法计算出纸张的价格。

起初我考虑使用 SQLite 或类似的数据库样式程序来填充我的计算器——但用户需要能够自己填充 Paper 数据库。因此,我开始使用 Core Data。

问题:我有一个 tableView,它获取核心数据并显示不同论文的可用——或者至少它应该这样做。为了测试,我已经创建了一个“添加纸张”按钮,该按钮生成随机纸张并将其添加到数据库中。我知道这是在创建随机随机纸,因为我能够在输出中显示它。但我实际上不知道它是否节省。

我遇到的问题是,当我尝试刷新表格并将数据显示到 tableView 时...它要么因 Nil 值而崩溃,要么不添加到 tableView。

我得出的结论是,我可能在表格中显示了错误的数据 - 或者 - 我没有正确保存数据 - 或者 - 我没有正确获取数据。

适用于 iOS 的在线资源仅对 Mac OS 有很大帮助。如有任何帮助,我们将不胜感激。 我的代码可以在下面找到,在此先感谢您:注意:我正在使用 CoreData 中的样板 AppDelegate 文件。

在 ViewController 中定义:

private var papers = [FlatPaper]()
private var appDelegate = NSApplication.shared.delegate as! AppDelegate
private let context = (NSApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

添加随机纸按钮(用于测试):

@IBAction func addPaper(_ sender: NSButton) {
let data = PaperData()
let paper = FlatPaper(entity: FlatPaper.entity(), insertInto: context)
paper.paperSize = data.paperSize
paper.paperWeight = data.paperWeight
paper.paperBrand = data.paperBrand
paper.paperColor = data.paperColor
paper.paperFinish = data.paperFinish
paper.paperPrice = data.paperPrice
appDelegate.saveAction(paper)
papers.append(paper)
print("Add Paper Button Pressed. \(paper)")
refresh()
tableView.reloadData()
}

扩展 NSTableDelegate 和 NSTableDataSource:

extension ViewController: NSTableViewDataSource, NSTableViewDelegate {

// Mark: - Specifying how many rows
func numberOfRows(in tableView: NSTableView) -> Int {
return papers.count
}

// Mark: - Populating the Columns and Rows with Data
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
let paperSpecs = papers[row]

if tableColumn!.title == "Paper Size" {
return paperSpecs.paperSize
} else if tableColumn!.title == "Paper Weight" {
return paperSpecs.paperWeight
} else if tableColumn!.title == "Paper Brand" {
return paperSpecs.paperBrand
} else if tableColumn!.title == "Paper Color" {
return paperSpecs.paperColor
} else if tableColumn!.title == "Paper Finish" {
return paperSpecs.paperFinish
} else {
return paperSpecs.paperPrice
}
}

// Mark: - Refresh Method for reloading all of the data
private func refresh() {
do {
papers = try context.fetch(FlatPaper.fetchRequest())
} catch let error as NSError {
print("Could not fetch. \(error), USER INFO: \(error.userInfo)")
}
}
}

最佳答案

tableview:objectValueFor 中,您应该使用 row 参数从数组中获取纸张规范对象,而不是创建新的(空)实例。

let paperSpecs = papers[row]

您可能还想查看 NSFetchedResultsController , 它在处理核心数据和 TableView 时非常有用。

关于swift - 在 NSTableView 中显示和使用核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51489606/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com