Search code examples
swiftuitableviewkingfisher

How to set Image at current Cell (Kingfisher)? Swift


I have an TableView with custom cells. Label smiles contain links.

How can I put Image from link to current ImageView'cell? My code

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let identifier = "ClientCell"
        self.cell = self.tableView.dequeueReusableCell(withIdentifier: identifier) as? customChatCell

let text = message[Constants.MessageFields.text] ?? ""
let selectedCell = self.tableView.cellForRow(at: indexPath) as? customChatCell

***

if text.range(of:"smiles") != nil {
            let url = URL(string: text)
            self.cell![indexPath.row].smile.kf.setImage(with: url)
        } 

***
}

not working. I'm getting error for line self.cell![indexPath.row].smile.kf.setImage(with: url)

Type 'customChatCell' has no subscript members

I'm using Kingfisher. If I use code

self.cell.smile.kf.setImage(with: url)

image putting into all cells, not for current.

Please help me fix it.


Solution

  • You should remove keeping the cell reference at class level. Your cellForRow should look like this,

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
           let identifier = "ClientCell"
           let cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? customChatCell
    
           let text = message[Constants.MessageFields.text] ?? ""
           if text.range(of:"smiles") != nil {
                let url = URL(string: text)
                cell.smile.kf.setImage(with: url)
           } else {
               // Reset image to nil here if it has no url
               cell.smile.image = nil  
           }
    } 
    

    Remember, you are using a single UIView(i.e, customChatCell) for each cell in UITableView so when you dequeue a cell it's your responsibility to update/reset the UI elements according to your data for each cell.