'How do I get the index of an array to properly save a unique value to Firebase?

In each row of a tableview there is a label and button. The label displays a quotes from an array. Users can tap the button to save the quote. Right now it works fine with UserDefaults, but I want to also save the information to Firebase. I can't seem to figure out how to get the quote to save to Firebase based on the heart/row that was tapped. I thought I could use IdexPath, but I can't seem to get it right. I'd like to save each quote as a unique value in Firebase and be able to delete it when the button is tapped again. However, I'm not so familiar with firebase.

I thought I could use IdexPath to determine which row was selected and then grab the label in that row to send to Firebase, but I can't seem to get it right. Instead I got an error preventing the code from running "Instance member 'row' cannot be used on type 'IndexPath'; did you mean to use a value of this type instead?"

import UIKit
import FirebaseDatabase
import FirebaseAuth

class QuotesMainViewController: UIViewController, UITableViewDelegate,    UITableViewDataSource {
    
 

@IBOutlet weak var quotesTableView: UITableView!
    
    struct Quote: Codable {
        var label: String
        var like: Bool = false // a priori, false
      }
    
        var quoteList: [Quote] = []
    
    
        override func viewDidLoad() {
        super.viewDidLoad()
        
        quotesTableView.delegate = self
        quotesTableView.dataSource = self
        
        let defaults = UserDefaults.standard
        if let data = defaults.data(forKey: "QuoteListKey") {
        if let array = try? PropertyListDecoder().decode([Quote].self, from: data) {
                quoteList = array
             }
        } else {
                quoteList = [Quote(label: "Quote1"), Quote(label: "Quote2"), Quote(label: "Quote3")]
           } 
    }
    
 @IBAction func likeTapped(_ sender: UIButton) {
        
        var ref: DatabaseReference?
        ref = Database.database().reference()
       
        quoteList[sender.tag].like.toggle()  // update the dataSource ; sender.tag gives the row in the array
        
        
        if quoteList[sender.tag].like {
        sender.setImage(UIImage(named: "GreenHeart"), for: .normal) // You can change here or ask for a reloadData()
            
        guard let user = Auth.auth().currentUser?.uid else { return }
                 ref!.child("users").child(Auth.auth().currentUser!.uid).child("Quotes").setValue(quoteList[IndexPath.row].label)
    
            
         if let data = try? PropertyListEncoder().encode(quoteList) {
          UserDefaults.standard.set(data, forKey: "QuoteListKey")
            }
            
            
        } else {
          sender.setImage(UIImage(named: "blankHeart"), for: .normal)   
            
        }  
    }
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return quoteList.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = quotesTableView.dequeueReusableCell(withIdentifier: "cell") as! QuotesTableViewCell
       
        cell.quoteLabel.text = quoteList[indexPath.row].label
      cell.likeButton.tag = indexPath.row    // Use tag to reference the cell, not to set true / false
        cell.likeButton.setImage(UIImage(named: quoteList[indexPath.row].like ? "GreenHeart" : "blankHeart"), for: .normal)

      return cell
    }
    
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source