微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决当我尝试重新加载日期时,Swift 5 TableView 在 ViewController 中发现 nil

我正在从 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
    }
}

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

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

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

解决方法

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

在 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() 
                }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。