Swift 表视图单元格未加载

Swift 表视图单元格未加载,swift,xcode,uitableview,Swift,Xcode,Uitableview,我试图在UITableView内部填充自定义UITableView单元格,但它没有在单元格中加载数据。我创建了一个配方数组,并用API调用的数据填充该数组。调试代码后,数组计数似乎为0,因此没有在单元格中加载数据,尽管我正在调用getRecipes()方法来填充数组。。你知道是什么原因造成的,或者如何修复吗 下面是我的代码: class MainPageViewController:UIViewController { //声明变量 @IBVAR recipeTableView:UITableV

我试图在
UITableView
内部填充自定义
UITableView单元格
,但它没有在单元格中加载数据。我创建了一个配方数组,并用API调用的数据填充该数组。调试代码后,数组计数似乎为0,因此没有在单元格中加载数据,尽管我正在调用
getRecipes()
方法来填充数组。。你知道是什么原因造成的,或者如何修复吗

下面是我的代码:

class MainPageViewController:UIViewController
{
//声明变量
@IBVAR recipeTableView:UITableView!
变量配方:[配方]=[]
重写func viewDidLoad()
{
recipeTableView.delegate=self
recipeTableView.dataSource=self
self.recipeTableView.reloadData()
recipes=self.getRecipes()
打印(“数组:\(recipes.count)”)
super.viewDidLoad()
}
}
//ui表视图函数
扩展MainPageViewController:UITableViewDataSource、UITableViewDelegate
{
//将表视图中的项目数设置为对象数组
func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int
{
打印(“数组计数:\(recipes.count)”)
return recipes.count
}
覆盖函数视图显示(u动画:Bool){
recipeTableView.reloadData()
super.viewdide显示(动画)
}
//获取数组中的数据并在表视图单元格中进行设置
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell
{
打印(“此处代码”)
让recipe=self.recipes[indexPath.row]
let cell=tableView.dequeueReusableCell(标识符为“RecipeCell”)
阿斯!乌伊塞尔
打印(“此处代码”)
cell.setRecipe(配方:配方)
返回单元;
}
func getRecipes()->[配方]
{
变量recipesTemp:[配方]=[]
//使用Moya作为中间人击中Spoonacular端点
let provider=MoyaProvider()
provider.request(.getRecipes(limitLicense:true,编号:10,标签:“素食者,甜点”))
{
转换$0
{
成功案例(让我们回答):
做{
//仅允许成功的HTTP代码
_=try response.filterSuccessfulStatusCodes()
//将数据解析为JSON
让json=try json(数据:response.data)
打印(“json日志:\(json)”)
//解析每个配方的JSON
recipesTemp=json[“recipes”].arrayValue.map({Recipe(json:$0)})
打印(“数组计数:\(recipesTemp.count)”)
打印(“数组:\(recipesTemp)”)
}
抓住{
打印(错误。本地化描述)
}
案例。失败(let错误):
打印(错误。本地化描述)
}
self.recipeTableView.reloadData()
}
返回温度
recipeTableView.reloadData()
}
}

获取配方的API异步工作

不能从包含异步任务的方法返回任何内容

  • viewDidLoad
    中,仅调用该方法
  • getRecipes
    中,删除返回值是没有意义的
  • 在异步闭包中,将结果分配给数据源数组并重新加载表视图
  • 您可以在主线程上重新加载表视图
或者使用完成处理程序


override func viewDidLoad()
{
recipeTableView.delegate=self
recipeTableView.dataSource=self
getRecipes()
}
func getRecipes()
{
//使用Moya作为中间人击中Spoonacular端点
let provider=MoyaProvider()
provider.request(.getRecipes(limitLicense:true,编号:10,标签:“素食者,甜点”))
{
转换$0
{
成功案例(让我们回答):
做{
//仅允许成功的HTTP代码
_=try response.filterSuccessfulStatusCodes()
//将数据解析为JSON
让json=try json(数据:response.data)
打印(“json日志:\(json)”)
//解析每个配方的JSON
self.recipes=json[“recipes”].arrayValue.map({Recipe(json:$0)})
打印(“数组计数:\(recipesTemp.count)”)
打印(“数组:\(recipesTemp)”)
DispatchQueue.main.async{
self.recipeTableView.reloadData()
}
}
抓住{
打印(错误。本地化描述)
}
案例。失败(let错误):
打印(错误。本地化描述)
}
}
}

请注意,在
viewdiload

末尾,您可以使用
配方
做一些事情。这里的问题是,您的请求函数在实际请求到达响应之前返回一个结果

您应该改为使用完成处理程序修改逻辑

func getRecipes(complition: @escaping ((_ response: [Recipe]) -> ()))  {
// Your request logic 
// onSuccess return the array like this
// complition(resultArray)
}

解析有错误吗?@andromedainiative没有,没有错误。我能够在控制台中看到数组的输出。是否
print(“json日志:\(json)”)
printing?一旦获得tableView,请在主线程中重新加载它。如果模拟数据而不执行请求,它是否有效?@Larme yes!我能够看到json。你说的主线是什么意思?我照你说的做了。我现在可以看到阵列已填充。但是,我的手机没有出现。是的,多次出现。我将更新问题中的控制台输出。填充数据源的代码可以工作。手机有问题。单元格的标识符和类设置是否正确?请尝试添加HeightForRowatineXpath。@是。我已经在情节提要中设置了标识符。
func getRecipes(complition: @escaping ((_ response: [Recipe]) -> ()))  {
// Your request logic 
// onSuccess return the array like this
// complition(resultArray)
}