无法识别的选择器发送到实例 0x7fecc7011000" In Swift

Unrecognized selector sent to instance 0x7fecc7011000" In Swift

我无法弄清楚为什么会发生此错误无法识别的选择器发送到实例 0x7fecc7011000"。我添加了所有必要的代码,但找不到实际上是哪个选择器在搞乱。

带有故事板的项目结构的屏幕截图。 网络管理员代码 .

class NetworkManager {
    
    func getCoins(from url: String, completion: @escaping (Result<VanueResponse, NetworkError>) -> Void ) {
        
        guard let url = URL(string: url) else {
            completion(.failure(.badURL))
            return
        }
        
        URLSession.shared.dataTask(with: url) { data, response, error in

            if let error = error {
                completion(.failure(.other(error)))
                return
            }

            if let data = data {
                //decode
                do {
                    let response = try JSONDecoder().decode(VanueResponse.self, from: data)
                    completion(.success(response))
                } catch let error {
                    completion(.failure(.other(error)))
                }
            }
        }
        .resume()
    }
    
    
}

主持人代码..

class VenuePresenter : VanueProtocol{

    // creating instance of the class
    private let view : VanueViewProtocol
    private let networkManager: NetworkManager
    private var vanues = [Venue]()
    var rows: Int{
        return vanues.count
    }
    // initilanize the class
    init(view:VanueViewProtocol , networkmanager:NetworkManager = NetworkManager()){
        self.view = view
        self.networkManager = networkmanager
    }
    
    
    func getVanue(){
        
        let url  = "https://coinmap.org/api/v1/venues/"
        
        networkManager.getCoins(from: url) { result in
            
            switch result {
            case.success(let respone):
                self.vanues = respone.results
                DispatchQueue.main.async {
                    self.view.resfreshTableView()
                }
            case .failure(let error):
                DispatchQueue.main.async {
                    self.view.displayError(error.localizedDescription)
                    print(Thread.callStackSymbols)
                }
            }
            
        }
    }
    
    
    

    func getId(by row: Int) -> Int {
        return vanues[row].id
    }
    
    func getLat(by row: Int) -> Double {
        return vanues[row].lat
    }
    
    func getCreated(by row: Int) -> Int {
        return vanues[row].createdOn
    }
    
    func getLon(by row: Int) -> Double? {
        return vanues[row].lon
    }
    
    
}

协议代码..

import Foundation

protocol VanueProtocol {
    func getVanue()
    func getId(by row: Int) -> Int
    func getLat(by row: Int) -> Double
    func getLon(by row: Int) -> Double?
    func getCreated(by row: Int) -> Int
    var rows: Int { get }
}

protocol VanueViewProtocol {
    func resfreshTableView()
   func displayError(_ message: String)
}

这是视图控制器中的代码。

class ViewController: UIViewController{

    
    private var presenter : VenuePresenter!
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.dataSource = self
        tableView.delegate = self
        presenter = VenuePresenter(view: self)
        presenter.getVanue()
        
    }
    
}

extension ViewController : VanueViewProtocol{
    func resfreshTableView() {
        tableView.reloadData()
        
    }
       func displayError(_ message: String) {
            let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert)
            let doneButton = UIAlertAction(title: "Done", style: .default, handler: nil)
            alert.addAction(doneButton)
            present(alert, animated: true, completion: nil)
        }
    }
extension ViewController: UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        presenter.rows
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        guard let cell = tableView.dequeueReusableCell(withIdentifier: DisplayView.identifier, for: indexPath) as? DisplayView
          else { return UITableViewCell() }
        
        let row = indexPath.row
        let id   = presenter.getId(by: row)
        let lat = presenter.getLat(by: row)
         guard let lon = presenter.getLon(by: row) else { return UITableViewCell() }
        let createdon = presenter.getCreated(by: row)
        cell.configureCell(id: id, lat: lat, lon: lon, createdon: createdon)
        return cell
    }
}
extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }
}
    

这是自定义视图控制器中名为显示视图的代码。

import UIKit

class DisplayView: UITableViewCell{
    
    static let identifier = "DisplayView"
    
    @IBOutlet weak var label1: UILabel!
    @IBOutlet weak var label2: UILabel!
    @IBOutlet weak var label3: UILabel!
    @IBOutlet weak var label4: UILabel!
    
    func configureCell(id: Int ,lat : Double , lon : Double , createdon: Int){
        label1.text = String(id)
        label2.text = String(lat)
        label3.text = String(lon)
        label4.text = String(createdon)
    
    }
   
    
    
}
    
     

这是我的模型。

struct Coin: Codable {
    let venues: [Venue]
}

// MARK: - Venue
struct Venue: Codable {
    let id: Int
    let lat, lon: Double
    let category, name: String
    let createdOn: Int
    let geolocationDegrees: String

    enum CodingKeys: String, CodingKey {
        case id, lat, lon, category, name
        case createdOn = "created_on"
        case geolocationDegrees = "geolocation_degrees"
    }
}

我添加了断点,但它重新调整为零,它需要 return 来自 API 的数据。这是 API link .https://coinmap.org/api/v1/venues/ 这是错误的屏幕截图。

这里是控制台window。

问题出在这个出口:

IBOutlet weak var tableView: UITableView!

您在故事板中将它连接到错误的对象。它连接到单元格,而不是 table 视图。看起来你一定是把它连接起来然后改变了它所连接的东西的class。