Swift 5 TableView 在我尝试重新加载日期时在 ViewController 中发现 nil

Swift 5 TableView found nil inside ViewController when i try to reloaddate

我正在从 API 端点获取数据,在第一次获取时,tableview 正在工作。

但是当我更改 API url 时,获取仍然有效,但对于 tableview xcode 抛出“致命错误:在隐式展开可选时意外发现 nil值”错误信息。

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
   
    @IBOutlet weak var tableView: UITableView!
    
    var listOfRecipes = [RecipeDetail]()
    {
        didSet {
            DispatchQueue.main.async {
                self.tableView.reloadData() --->> Here i get the nil error
            }
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.delegate = self
        tableView.dataSource = self
        
        callApi()
        
    }
    
    func callApi() {
        print("------------------- API -------------------")
        print(ApiSettings.instance.apiEndpoint)
        //self.listOfRecipes.removeAll()
        let recipeRequest = RecipeRequest(url: ApiSettings.instance.apiEndpoint)
        recipeRequest.getData{  result in
            switch result {
                case .failure(let error):
                    print(error)
                case .success(let recipes):
                    self.listOfRecipes = recipes
            }
        }
    }
  
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listOfRecipes.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let recipe = listOfRecipes[indexPath.row]
        cell.textLabel?.text = recipe.title
        cell.detailTextLabel?.text = recipe.slug
        return cell
    }
}

我还尝试从故事板上的表视图中删除所有连接,然后再次添加它们,还有委托和数据源,但它仍然无法正常工作。第一次加载完美,但在应用程序崩溃后。

我还检查了 listOfRecipes didSet,其中的数组包含来自第二个 API 查询的新值。

有人有什么建议吗?谢谢!

在 属性 观察者中重新加载 table 视图不是一个好习惯。发生错误的原因很可能是 table 视图出口在第一次调用观察者时尚未连接。

在 API 调用中重新加载它。

var listOfRecipes = [RecipeDetail]()


func callApi() {
    print("------------------- API -------------------")
    print(ApiSettings.instance.apiEndpoint)
    //self.listOfRecipes.removeAll()
    let recipeRequest = RecipeRequest(url: ApiSettings.instance.apiEndpoint)
    recipeRequest.getData{  result in
        switch result {
            case .failure(let error):
                print(error)
            case .success(let recipes):
                DispatchQueue.main.async {
                   self.listOfRecipes = recipes
                   self.tableView.reloadData() 
                }
        }
    }
}