核心数据获取 int 不显示在 tableview 单元格上
core data fetching int not displaying on tableview cell
我正在编写 swift 代码,目的是在每个 tableview 单元格上显示越来越多的数字。现在没有显示 int。所以第一个 tableview 单元格应该说 1,第二个应该说 2。您可以在下面的 gif 中看到 tableview 单元格发生了什么,单击按钮时它们中没有任何内容。下面的函数是点击按钮的时候。
var pageNumber = 1
var itemName : [Player] = []
func enterData() {
theScores.reloadData()
let appDeldeaget = UIApplication.shared.delegate as! AppDelegate
let context = appDeldeaget.persistentContainer.viewContext
// Simpler way to create a new Core Data object
let theTitle = Player(context: context)
// Simpler way to set the position attribute
theTitle.positon = Int64(pageNumber)
print(pageNumber)
// pageNumber must be of type Int64, otherwise use Int64(pageNumber)
do {
try context.save()
itemName.append(theTitle)
pageNumber += 1
} catch {
// handle errors
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let title = itemName[indexPath.row]
let cell = theScores.dequeueReusableCell(withIdentifier: "MyCell", for : indexPath)
cell.selectionStyle = .default
let attr5 = title.value(forKey: "positon") as? String
let text = [" Item :", attr5].compactMap { [=10=] }.reduce("", +)
cell.textLabel?.text = "\(text)"
cell.textLabel?.textAlignment = .center
cell.layoutMargins = UIEdgeInsets.zero
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero
return cell
}
这就是它不起作用的原因。你有这个:
let attr5 = title.value(forKey: "positon") as? String
let text = [" Item :", attr5].compactMap { [=10=] }.reduce("", +)
这是一种非常复杂的尝试和执行此操作的方法,而且它并不像写的那样有效。问题是 position
的值是一个 Int64
而你需要一个字符串。但是像那样使用 as?
不会将它变成一个字符串。当那行代码运行时,Swift 说,我可以把它变成一个字符串吗?但它不能。因此 as? String
为零,并且您的 table 单元格不包含该数字,因为转换失败。
更好的方法是
if let position = title.value(forKey: "positon") {
cell.textLabel?.text = "Item : \(positon))"
}
但只有当您出于某种原因真的想使用 value(forKey:)
时才可以这样做。您可能不需要它,因为通常 Xcode 会为每个具有命名属性的实体创建 NSManagedObject
的子类。所以更好的是
cell.textLabel?.text = "Item: \(title.position)"
这两个都有效,因为字符串插值知道如何将整数转换为字符串。
您可能应该在 context.save()
之后调用 .reloadData()
我正在编写 swift 代码,目的是在每个 tableview 单元格上显示越来越多的数字。现在没有显示 int。所以第一个 tableview 单元格应该说 1,第二个应该说 2。您可以在下面的 gif 中看到 tableview 单元格发生了什么,单击按钮时它们中没有任何内容。下面的函数是点击按钮的时候。
var pageNumber = 1
var itemName : [Player] = []
func enterData() {
theScores.reloadData()
let appDeldeaget = UIApplication.shared.delegate as! AppDelegate
let context = appDeldeaget.persistentContainer.viewContext
// Simpler way to create a new Core Data object
let theTitle = Player(context: context)
// Simpler way to set the position attribute
theTitle.positon = Int64(pageNumber)
print(pageNumber)
// pageNumber must be of type Int64, otherwise use Int64(pageNumber)
do {
try context.save()
itemName.append(theTitle)
pageNumber += 1
} catch {
// handle errors
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let title = itemName[indexPath.row]
let cell = theScores.dequeueReusableCell(withIdentifier: "MyCell", for : indexPath)
cell.selectionStyle = .default
let attr5 = title.value(forKey: "positon") as? String
let text = [" Item :", attr5].compactMap { [=10=] }.reduce("", +)
cell.textLabel?.text = "\(text)"
cell.textLabel?.textAlignment = .center
cell.layoutMargins = UIEdgeInsets.zero
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero
return cell
}
这就是它不起作用的原因。你有这个:
let attr5 = title.value(forKey: "positon") as? String
let text = [" Item :", attr5].compactMap { [=10=] }.reduce("", +)
这是一种非常复杂的尝试和执行此操作的方法,而且它并不像写的那样有效。问题是 position
的值是一个 Int64
而你需要一个字符串。但是像那样使用 as?
不会将它变成一个字符串。当那行代码运行时,Swift 说,我可以把它变成一个字符串吗?但它不能。因此 as? String
为零,并且您的 table 单元格不包含该数字,因为转换失败。
更好的方法是
if let position = title.value(forKey: "positon") {
cell.textLabel?.text = "Item : \(positon))"
}
但只有当您出于某种原因真的想使用 value(forKey:)
时才可以这样做。您可能不需要它,因为通常 Xcode 会为每个具有命名属性的实体创建 NSManagedObject
的子类。所以更好的是
cell.textLabel?.text = "Item: \(title.position)"
这两个都有效,因为字符串插值知道如何将整数转换为字符串。
您可能应该在 context.save()
之后调用 .reloadData()