无法转换UITableViewCell进行键入

时间:2018-12-19 08:14:53

标签: ios swift

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    final let url = URL(string : "https://simplifiedcoding.net/demos/view-flipper/heroes.php")
    var Heroes1 = [Hero]()

    @IBOutlet weak var tableView: UITableView!
    //@IBOutlet weak var table: Actorcell!

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        downloadJson()
        // Do any additional setup after loading the view, typically from a nib.
    }

    func downloadJson() {
        guard let downloadurl = url else{ return }
        URLSession.shared.dataTask(with: downloadurl) { data, urlresponse, error in
            guard let data = data, error == nil, urlresponse != nil else{
                print("Something Wrong")
                return
            }
            //print("downloaded")
            do{
                let decoder = JSONDecoder()
                let downloadedActor = try decoder.decode(Heroes.self, from: data)
                self.Heroes1 = downloadedActor.heroes
                print(downloadedActor)
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            }
            catch{
                print(error)
               print("Something Went Wrong")
            }
        }.resume()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return Heroes1.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //let cell = tableView.dequeueReusableCell(withIdentifier:" HotelCell") as! ActorCell!
        let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell") as! Herocell?
        cell?.nameLbl.text = Heroes1[indexPath.row].name
        print(Heroes1[indexPath.row].name)
        if let imageURL = URL(string: Heroes1[indexPath.row].imageurl) {
            DispatchQueue.global().async {
                let data = try? Data(contentsOf: imageURL)
                if let data = data {
                    let image = UIImage(data: data)
                    DispatchQueue.main.async {
                        cell?.imgLbl.image = image
                        print(image)
                    }
                }
            }
        }
        return UITableViewCell()
    }
}
  

无法将类型为'UITableViewCell'(0x1057a2038)的值强制转换为   'actors.Herocell'(0x1014a3f40)。 2018-12-19 12:58:55.871615 + 0530   actors [3761:187113]无法转换类型为'UITableViewCell'的值   (0x1057a2038)转换为'actor.Herocell'(0x1014a3f40)。

先谢谢了。完整的项目链接:https://www.dropbox.com/sh/mlabuhk6mllwbzs/AADoHjZxg2e8AtQB9xfTrZMGa?dl=0

2 个答案:

答案 0 :(得分:4)

更改此:

self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")

收件人:

self.tableView.register(Herocell.self, forCellReuseIdentifier: "cell")

在这里,您说的是使用复用标识符“ cell”注册的单元格类型为UITableViewCell,然后在cellForRowAt中,您尝试将其强制转换为HeroCell

您需要将HeroCell注册为“单元格”复用标识符的类型

答案 1 :(得分:0)

在您的项目中,您显然正在使用原型单元格。在这种情况下

您必须不要在代码中注册单元格

仅当您使用额外的XIB文件时,才需要注册单元格。

第二个问题是IB中单元格的模块设置。保持从目标继承模块处于选中状态,并将Module设置为none。

cellForRow中写

let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! Herocell

此API始终返回有效的单元格。

您必须返回出队的单元格,而不是通用的UITableViewCell()

return cell 

注意:

即使在后台线程上,与Data(contentsOf:)中的cellForRow同步加载数据(即使在后台线程上)也是非常不好的编程习惯。可以立即释放单元,并且没有缓存,只要重新加载行,图像就会一次又一次地加载。