这是一个与名为Eureka的Swift开源项目有关的问题,我在这里发布了这个问题,因为他们在这里监控他们的标签。
好的,我在视图控制器的viewDidLoad
方法中创建了一个表单。同时我对API进行http调用以获取数据列表(作业)。这个调用是异步的。我想在PushRow
。
由于此API调用是异步的,因此在收到此数据时,表单已经设置完毕。我有一个类级别的数组设置,用http调用的作业列表填充。同一个数组被分配给该行的options
属性。我在收到数据时将值分配给数组。但是当我去点击PushRow
时,它就是空的。
class CreateEventViewController: FormViewController {
private var jobs = [Job]()
override func viewDidLoad() {
super.viewDidLoad()
setupForm()
api.getJobs(.LeadCreated) { jobs, error in
if let error = error {
print(error.localizedDescription)
return
}
if let jobs = jobs {
self.jobs = jobs
}
}
}
private func setupForm() {
form
+++ Section()
<<< PushRow<String>("Jobs") {
$0.title = "Choose Job"
$0.options = jobs.map { $0.description }
$0.selectorTitle = "Choose..."
}.onPresent { from, to in
to.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: from, action: #selector(CreateEventViewController.multipleSelectorDone(_:)))
}
}
}
是否有某种方法可以刷新或重新加载特定行或整个表单的数据?
更新1
根据凯文的answer,我修改了我的代码,如下所示。
override func viewDidLoad() {
super.viewDidLoad()
api.getJobs(.LeadCreated) { jobs, error in
if let error = error {
print(error.localizedDescription)
return
}
if let jobs = jobs {
self.jobs = jobs
if let jobsRow = self.form.rowByTag("Jobs") {
jobsRow.updateCell()
}
}
}
setupForm()
}
但由于某种原因,它仍然无法正常工作。选项是空的。我检查了通过标签正确拾取的单元格。无论如何,我也尝试了tableView.reloadData()
,但无济于事。
答案 0 :(得分:4)
我找到了!您必须在行中添加.cellUpdate {...}
闭包,并在其中将值分配给options
属性。像这样,
<<< PushRow<String>("Jobs") {
$0.title = "Choose Job"
$0.options = jobs.map { $0.description }
$0.selectorTitle = "Choose..."
}
.cellUpdate { cell, row in
row.options = self.jobs.map { $0.description }
}
答案 1 :(得分:1)
在FAQ部分的README底部有一个重新加载的参考
如何使用字典
设置表单值... 如果表格是 已经显示我们必须重新加载可见的行 重新加载表视图
tableView.reloadData()
或调用 每个可见行updateCell()
。
但是,我甚至认为没必要。更新setupForm()
后,只需致电self.jobs
即可。
您可以在FormViewController
源代码中看到,设置form
时,会重新加载tableview。
public var form : Form {
get { return _form }
set {
_form.delegate = nil
tableView?.endEditing(false)
_form = newValue
_form.delegate = self
if isViewLoaded() && tableView?.window != nil {
tableView?.reloadData()
}
}
}