[SOLVED] core data fetching int not displaying on tableview cell


I am writing swift code with the goal of displaying a increasing number on every tableview cell. Right now the int is not being display. So the first tableview cell should say 1 and the 2nd should say 2. You can see in the gif below what is going along with the tableview cell and nothing is appearing in them when the button is clicked. The func below is when the button is clicked.

   var pageNumber = 1

 var itemName : [Player] = []

func enterData() {
 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)
    // pageNumber must be of type Int64, otherwise use Int64(pageNumber)
 do {
     try context.save()
     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 { $0 }.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

enter image description here
enter image description here


Here’s why it doesn’t work. You have this:

let attr5 = title.value(forKey: "positon") as? String

let text = [" Item :",   attr5].compactMap { $0 }.reduce("", +)

This is a really complicated way to try and do this, and it doesn’t work as written. The problem is that the value of position is an Int64 and you need a string. But using as? like that doesn’t turn it into a string. When that line of code runs, Swift says, can I just make this into a string? But it can’t. So the as? String is nil, and your table cells don’t include the number because the conversion failed.

A better way would be something like

if let position = title.value(forKey: "positon") {
    cell.textLabel?.text = "Item : \(positon))"

But that’s only if you really want to use value(forKey:) for some reason. You probably don’t need that because normally Xcode creates a subclass of NSManagedObject for each entity with named properties. So even better would be

cell.textLabel?.text = "Item: \(title.position)"

These both work because string interpolation knows how to convert an integer to a string.

Answered By – Tom Harrington

Answer Checked By – Clifford M. (BugsFixing Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *