核心数据获取 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()