无法识别的选择器发送到实例 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。
我无法弄清楚为什么会发生此错误无法识别的选择器发送到实例 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。