在下面的代码段中,SecondViewController
通过FirstViewController
中的segue打开(第一个视图控制器的内容未提供与问题无关)。 SecondViewController
包含一个tableView,但显示时它是空的(serviceMain
数组),我已经验证在tableView函数中调用数组,并且print(serviceMain.count)
中的数组确实为空(B
)阻止评论。但是,serviceMain
在ViewDidLoad
(A
块注释)中构造和调用时实际上不为空。
我尝试ViewDidLoad
而不是ViewWillAppear
,而是产生了相同的结果。
我确信必须与segues如何工作有关,因为我可以使用FirstViewController
传递来自prepare(for segue:sender:)
的{{1}}数据,而companyName
这个数据是精细。我可以在serviceMain
内更新FirstViewController
并将数据传递给SecondViewController
,但我希望我可能会遗漏某些内容,并且可以在SecondViewController
内完成。非常感谢所有
import UIKit
class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var serviceMain: [Service] = []
var companyName: String = "" // this value is updated with prepare from another ViewController via segue
@IBOutlet var mobileTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
Service.parseData(providerName: companyName, id: 999) { (services: [Service]) in
for service in services {
self.serviceMain.append(service)
}
// (A) - serviceMain.count is returning a correct value:
print("number of elements in serviceMain", serviceMain.count, "calling in viewDidLoad")
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// (B) - serviceMain.count is returning 0:
print("number of elements in serviceMain", serviceMain.count, "calling in tableView:")
return serviceMain.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = mobileTableView.dequeueReusableCell(withIdentifier: "mobileServiceCell", for: indexPath)
let serviceIndividualRow = serviceMain[indexPath.row]
cell.textLabel?.text = serviceIndividualRow.name!
return cell
}
}
答案 0 :(得分:1)
尝试一下didSet。只要它在“set”之前调用,在viewDidLoad,viewWillLoad等之前调用。
var companyName: String? = "" {
didSet {
// DO SOMETHING
}
}
编辑您关于体验延迟的评论:
当您获取数据时,您可能想尝试在其中添加获取数据代码:
DispatchQueue.global(qos: .userInteractive).async {
// FETCH DATA FROM SERVER
}
此外,为了加快速度,无论您何时重新加载tableViews / collectionViews,您可能希望将其添加到其中:
DispatchQueue.main.async {
self.tableView.reloadData()
}