我意识到在JSON完成块中调用了tableView.reloadData()以用接收到的数据重新加载tableView;我想知道是否只有在此完成块完成后才能加载tableView。发生的情况是,tableView首先使用默认单元格为空,然后几秒钟后,在完成块内调用reloadData()方法,并且tableView重新加载,并且数据与自定义单元格一起出现。我只想在收到数据时和之后加载tableView。我可以采取什么方法?有没有一种方法只能在完成后加载视图?我基本上不想让用户在空白表上看到几秒钟,然后等待数据出现。这是我的viewController代码和用于保存数据模型的简单结构。
viewController:
import UIKit
class ViewController: UIViewController, UITableViewDataSource {
var users = [User]()
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
guard let url = URL(string: "https://jsonplaceholder.typicode.com/users") else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
do {
guard let data = data else { return }
let recieved = try JSONDecoder().decode([User].self, from: data)
self.users = recieved
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch let error as NSError {
print("Error: \(error.description)")
}
}.resume()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return users.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
cell.name.text = users[indexPath.row].name
cell.eMail.text = users[indexPath.row].email
return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
}
结构:
struct User: Decodable {
let id: Int
let name: String
let username: String
let email: String
let company: Company
}
struct Company: Decodable {
let name: String
let catchPhrase: String
let bs: String
}
答案 0 :(得分:0)
由于您实际上是在等待网络呼叫才能显示数据,所以为什么不在表格视图顶部的视图上显示微调框或活动指示器,然后在成功解析数据后将其关闭(或处理任何错误)。另一种选择是在将视图加载到另一个类之前请求数据。
答案 1 :(得分:0)
我认为您可以在UITableView中添加活动指示器。因此,用户将不会仅看到空白的UITableView。或者,您可以在UITableView中添加背景图像,如果数据仍然为空,则可以显示它,并在JSON解码后将其隐藏。
有关UITableView中的参考背景图像,您可以看到here
答案 2 :(得分:0)
根据您的建议;这是我使用activityIndicator采取的路线。我在tableView上设置了一个UIView,然后在该UIView上添加了一个activityIndicator,并且还在activityIndicator旁边添加了一个简单的UILabel,字符串为“ Loading”。在接收到数据并重新加载tableView之后,我在JSON任务中使用了propertyAnimator,然后停止activityIndicator,使UIView褪色以显示tableView,然后从superView中删除UIView。这是代码:
import UIKitclass ViewController: UIViewController, UITableViewDataSource {
splices
}