Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 致命错误:隐式展开“中的可选值时意外发现nil”;self.tableView.realoadData();_Swift_Xcode_Api_Uitableview - Fatal编程技术网

Swift 致命错误:隐式展开“中的可选值时意外发现nil”;self.tableView.realoadData();

Swift 致命错误:隐式展开“中的可选值时意外发现nil”;self.tableView.realoadData();,swift,xcode,api,uitableview,Swift,Xcode,Api,Uitableview,我提出了API请求,并希望将其添加到表视图中。调用realoadData()是否早于加载数据?。tableView存在问题,因为API调用工作正常。代码如下: class ViewController: UIViewController { var tableView : UITableView! var listOfHolidays = [HolidayDetails](){ didSet{ DispatchQueue.main.async{

我提出了API请求,并希望将其添加到表视图中。调用realoadData()是否早于加载数据?。tableView存在问题,因为API调用工作正常。代码如下:

class ViewController: UIViewController {

var tableView : UITableView!
var listOfHolidays = [HolidayDetails](){
    didSet{
        DispatchQueue.main.async{
            self.tableView.reloadData()
            self.navigationItem.title = "\(self.listOfHolidays.count) Holidays found"
        }
    }
}
在ViewDidLoad中调用Fetch函数

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    DataFetch { (holidaydetails) in
        for items in holidaydetails{
            self.listOfHolidays.append(items)
            print(items)
        }
    
    }
}
获取API调用的函数

func DataFetch(completionHandler : @escaping ([HolidayDetails]) -> Void){
    guard let url = URL(string: "https://holidayapi.com/v1/holidays?   pretty&country=IN&year=2020&key=457d9815-2e0a-4140-9515-0f6ef0d5f8b9") else{return(print("Error"))}
    
    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        
        guard let data = data else{ return print("Error")}
        do{
            let holidayData = try JSONDecoder().decode(Holidays.self, from: data)
            let holidayDetail = holidayData.holidays
            completionHandler(holidayDetail)
        }
        catch{
            let error = error
            print(error.localizedDescription)
        }
    }
    task.resume()
}
}
扩展:

extension ViewController : UITableViewDataSource,UITableViewDelegate {

  func numberOfSections(in tableView: UITableView) -> Int {
      return 1
  }

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return listOfHolidays.count
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: "cell",for: indexPath)
      let holidays = listOfHolidays[indexPath.row]
      cell.textLabel?.text = holidays.name
      cell.detailTextLabel?.text = holidays.date
      return cell
  }
}

我还有另一个带有数据模型的文件:

import Foundation

struct Holidays : Codable {
   var holidays : [HolidayDetails]
}
struct HolidayDetails : Codable {
   var name : String
   var date : String
}

您的tableView为nil:
var tableView:UITableView

您只需要初始化它,例如:
var tableView=UITableView()


另外,您刚刚了解到使用它不是一种好的做法

正如@Larme所评论的,问题很可能出现在您的
didSet
oberserver中。 在某个地方,您将listOfHolidays设置为该控制器视图加载之前的值,例如,
tableView
插座连接到
UITableView
之前。 从setter中更新UI并不总是一个好主意。但是如果您真的需要它,可以通过检查tableView是否为
nil
,来避免崩溃:

var listOfHolidays=[HolidayDetails](){
迪塞特{
guard self.tableView!=nil else{return}
DispatchQueue.main.async{
self.tableView.reloadData()
self.navigationItem.title=“\(self.listOfHolidays.count)找到假日”
}
}
}

此代码不应存在重新加载问题:如果
tableView
nil
,则不会调用
reloadData
,但这并不重要,因为只要连接了插座(在
viewDidLoad
之前),它就会自动触发重新加载。

tableView
为nil。它在故事板中连接吗?否则,行
myViewController.listOfHolidays=
在哪里?可能是您在加载
tableView
之前正在访问它,因为
didSet
如果
listOfHolidays
tableView
nil
。你期待什么?