Swift 致命错误:隐式展开“中的可选值时意外发现nil”;self.tableView.realoadData();
我提出了API请求,并希望将其添加到表视图中。调用realoadData()是否早于加载数据?。tableView存在问题,因为API调用工作正常。代码如下: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{
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
。你期待什么?