我無法弄清楚為什么會發生此錯誤, 無法識別的選擇器發送到實體 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
}
}
這是名為 display view 的自定義視圖控制器中的代碼。
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"
}
}
我添加了斷點,但它重新調整 nil 并且它需要從 API 回傳資料。這是 API 鏈接。https://coinmap.org/api/v1/venues/
這是錯誤的螢屏截圖。

這是控制臺視窗。

uj5u.com熱心網友回復:
問題是這個插座:
IBOutlet weak var tableView: UITableView!
您在情節提要中將其連接到錯誤的物件。它與單元格掛鉤,而不是表格視圖。看起來你一定是把它連接起來了,然后改變了它所連接的東西的類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/425808.html
