在从数据库中检索数据源之前执行UITableView Delegate函数 - SWIFT?

时间:2018-03-12 11:09:07

标签: ios swift uitableview

我正在尝试从数据库中将一些数据加载到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

2 个答案:

答案 0 :(得分:3)

您的数据是从网络中提取的,需要一些时间。渲染TableView不需要等待。

我们将这些较长的任务称为异步任务,它们在后台运行,应用程序继续执行其他操作,直到我们得到响应。

您需要做的就是在收到回复时告诉TableView重新加载数据

DispatchQueue.main.async {
    self.arrayOptions = myArray
    self.tableView.reloadData()
}

修改

我认为您正在使用已包含UITableView属性的UITableViewController,因此您可以使用self.tableView。如果您没有使用UITableViewController,则需要创建一个插座并设置self.tableView.dataSource = selfself.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();
  }
});