我在控制臺視窗中找到了一些 nil 值存在于 API 中。我將提交的選項標記為模型以及其他視圖控制器但仍然給我相同的訊息。 呼叫初始化程式時沒有完全匹配
故事板截圖。

這是我的模型。
import Foundation
// MARK: - Welcome
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"
}
}
這是演示者類。
import Foundation
import UIKit
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.venues
DispatchQueue.main.async {
self.view.resfreshTableView()
}
case .failure(let error):
DispatchQueue.main.async {
self.view.displayError(error.localizedDescription)
//self.view.displayError(error.errorDescription ?? "")
print(error)
}
}
}
}
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 UIKit
class ViewController: UIViewController{
private var presenter : VenuePresenter!
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
setUpUI()
presenter = VenuePresenter(view: self)
presenter.getVanue()
self.tableView.register(DisplayView.self, forCellReuseIdentifier: DisplayView.identifier)
}
private func setUpUI() {
tableView.dataSource = self
tableView.delegate = self
}
}
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() }
//tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DisplayView1")
let row = indexPath.row
guard let id = presenter.getId(by: row) else { return UITableViewCell()}
guard let lat = presenter.getLat(by: row) else { return UITableViewCell () }
guard let lon = presenter.getLon(by: row) else { return UITableViewCell() }
guard let createdOn = presenter.getCreated(by: row) else { return UITableViewCell() }
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)
}
}
這是錯誤訊息的螢屏截圖。

uj5u.com熱心網友回復:
你試過用“(lat)”嗎?
label2.text = "\(lat)"
你也可能想解開選項,因為你也得到了一個錯誤
label1.text = "\(id ?? "default")"
uj5u.com熱心網友回復:
當您使用帶有原型單元的故事板時,您不需要在viewDidLoad.
您需要確保DisplayView在情節提要的原型單元中放置了正確的重用識別符號,設定單元的自定義類并連接出口。
uj5u.com熱心網友回復:
您顯然正在使用 Prototype Cells 并且錯誤表明未設定 Interface Builder 中的單元格識別符號
使用原型單元時,您不得注冊任何單元。洗掉
self.tableView.register(DisplayView.self, forCellReuseIdentifier: DisplayView.identifier)在螢屏截圖所代表的視圖中選擇“顯示視圖”,然后按??5打開屬性檢查器。
DisplayView在Identifier欄位中輸入。
旁注:永遠不要guard在cellForRow. 強行解開
let cell = tableView.dequeueReusableCell(withIdentifier: DisplayView.identifier,
for: indexPath) as! DisplayView
代碼不得崩潰。如果是這樣,您犯了一個可以立即修復的設計錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/427925.html
