Search code examples
swiftcore-dataintegerfetchappend

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() {
    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 { $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


Solution

  • 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.