我有一个从解析中检索数据的函数,如果它是nil,那么表视图将呈现一个tableview单元格,但如果服务器有数据,那么它将呈现不同的表格视图单元格。但我必须声明一个返回函数,当我这样做时,我得到一个:
void函数中出现意外的非void返回值
我无法解决的错误。这是代码。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
if indexPath.row == 0 {
// STEP 2. Find posts made by people appended to followArray
let query = PFQuery(className: "CommercialUsers")
query.addDescendingOrder("createdAt")
query.findObjectsInBackground(block: { (objects, error) -> Void in
if error == nil {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath as IndexPath) as! cell2
cell.delegate = self
return cell
for object in objects! {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath as IndexPath) as! cell1
cell.delegate = self
return cell
}
} else {
print(error!.localizedDescription)
}
})
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath as IndexPath) as! cell1
cell.delegate = self
return cell
}
}
这是错误的图像 Error Image
答案 0 :(得分:0)
欢迎来到SO。
您正在使用一个完成关闭的函数findObjectsInBackground
。完成闭包是cellForRowAt函数中的另一个函数。该函数保留(捕获)您传入的完成闭包,并且在后台调用完成之前不会调用它。
您传入的块不会返回值。那就是
(objects, error) -> Void in
装置。它说“这个块需要2个参数,但不返回任何内容。”
你不能从完成闭包内部返回单元格。
相反,你要做的是调用findObjectsInBackground,然后,在它的块之外,完成配置单元格并返回它。
在findObjectsInBackground的完成闭包内,您应该使用tableView.cell(at:)
从表视图中获取单元格,并将新获取的数据安装到单元格中。
我刚注意到你的完成处理程序中有代码,它们通过返回的对象循环并创建多个单元格。这根本行不通。你需要重新考虑你的设计。
cellForRow(at:)
函数必须获取,配置并返回单个单元格。在您的cellForRow(at:)
函数返回之后,您正在使用的异步方法将无法完成,因此您需要返回没有正在加载的数据的单元格,然后将数据安装到完成时的单元格中处理程序。