我正在尝试从数据库中将一些数据加载到UITableView
,但用于填充tableView
的委托函数执行并在我有机会检索数据之前返回一个空表显示在tableView
?
请有人可以提供建议吗?
这是我的代码:
var arrayOptions = [String]()
override func viewDidLoad() {
super.viewDidLoad()
print("MenuOptions viewDidLoad ...")
getArrayOfOptionsForMenu()
}
private func getArrayOfOptionsForMenu(){
// Get list of menu options and populate array
// Construct parameters to send to server
var parameter = [String:String]()
parameter["getoptions"] = "formenu"
let optionsURL = LabBookAPI.getCredentialsUrl(parameters: parameter, targetUrl: "getOptions.php?")
var request = URLRequest.init(url: optionsURL)
request.httpMethod = "POST"
let task = session.dataTask(with: request) { (data, response, error) in
if let jsonData = data{
do{
let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: [])
print("jsonObject: \(jsonObject)")
guard
let myArray = jsonObject as? [String] else{
print("data not in [String] format")
return
}
DispatchQueue.main.async{
self.arrayOptions = myArray
print("self.arrayOptions.count: \(self.arrayOptions.count)")
}
}catch let error{
print("print error: \(error)")
}
}else if let requestError = error{
print("error detail: \(requestError)")
}else{
print("unexpected error")
}
}// End task
task.resume()
}// End of function
/* DELEGATE FUNCTIONS */
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("numberOfRowsInSection self.arrayOptions.count: \(self.arrayOptions.count)")
return self.arrayOptions.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print("cellForRowAt self.arrayOptions.count: \(self.arrayOptions.count)")
let cell = UITableViewCell.init(style: .value1, reuseIdentifier: "optionCell")
cell.textLabel?.text = self.arrayOptions[indexPath.row]
print("self.arrayOptions[indexPath.row]: \(self.arrayOptions[indexPath.row])")
return cell
}
我的控制台:
viewDidLoad ... NSDataPDFDocument:nil MenuOptions viewDidLoad ... MenuOptions viewWillAppear ... numberOfRowsInSection self.arrayOptions.count:0 numberOfRowsInSection self.arrayOptions.count:0 numberOfRowsInSection self.arrayOptions.count:0 jsonObject :( 轮廓, "退出" )self.arrayOptions.count:2
答案 0 :(得分:3)
您的数据是从网络中提取的,需要一些时间。渲染TableView不需要等待。
我们将这些较长的任务称为异步任务,它们在后台运行,应用程序继续执行其他操作,直到我们得到响应。
您需要做的就是在收到回复时告诉TableView重新加载数据
DispatchQueue.main.async {
self.arrayOptions = myArray
self.tableView.reloadData()
}
修改强>
我认为您正在使用已包含UITableView属性的UITableViewController,因此您可以使用self.tableView。如果您没有使用UITableViewController,则需要创建一个插座并设置self.tableView.dataSource = self
和self.tableView.delegate = self
答案 1 :(得分:0)
您只需要重新加载表格数据:
// Open/close side menu
function openSlideMenu() {
document.getElementById('side-menu').style.width = '250px';
document.getElementById('heading-one').style.marginLeft = '250px';
}
function closeSlideMenu() {
document.getElementById('side-menu').style.width = '0';
document.getElementById('heading-one').style.marginLeft = '0';
}
// Show/hide side menu icon
$(document).ready(function() {
$(".open-slide").show();
if (openSlideMenu()) {
$(".open-slide").hide();
} else if (closeSlideMenu()) {
$(".open-slide").show();
}
});