动态加载一行的选项
Dynamically loading options for a row
这是一个与名为 Eureka 的 Swift 开源项目相关的问题,我将此问题发布在 SO 上,因为他们在这里监控他们的标签。
好的,所以我在视图控制器的 viewDidLoad
方法中创建了一个表单。同时,我对 API 进行了 http 调用以获取数据(工作)列表。此调用是异步的。我想在 PushRow
.
中将这些作业显示为选项值
由于此 API 调用是异步的,因此在收到此数据时,表格已经设置完毕。我有一个 class 级数组设置,用于填充来自 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") {
[=10=].title = "Choose Job"
[=10=].options = jobs.map { [=10=].description }
[=10=].selectorTitle = "Choose..."
}.onPresent { from, to in
to.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: from, action: #selector(CreateEventViewController.multipleSelectorDone(_:)))
}
}
}
是否有某种方法可以刷新或重新加载特定行或整个表单的数据?
更新 1
根据下面凯文的 ,我修改了我的代码如下。
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()
但无济于事。
在 FAQ 部分的 README 底部有一个关于重新加载的参考
How to set the form values using a dictionary
...
If the form was
already displayed we have to reload the visible rows either by
reloading the table view tableView.reloadData()
or invoking
updateCell()
to each visible row.
但是,我什至认为没有必要。更新 self.jobs
后只需调用 setupForm()
。
从FormViewController
源码可以看出,设置[=16=]时,会重新加载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()
}
}
}
我找到了!您必须将 .cellUpdate {...}
闭包添加到该行,并在其中将值分配给 options
属性。像这样,
<<< PushRow<String>("Jobs") {
[=10=].title = "Choose Job"
[=10=].options = jobs.map { [=10=].description }
[=10=].selectorTitle = "Choose..."
}
.cellUpdate { cell, row in
row.options = self.jobs.map { [=10=].description }
}
这是一个与名为 Eureka 的 Swift 开源项目相关的问题,我将此问题发布在 SO 上,因为他们在这里监控他们的标签。
好的,所以我在视图控制器的 viewDidLoad
方法中创建了一个表单。同时,我对 API 进行了 http 调用以获取数据(工作)列表。此调用是异步的。我想在 PushRow
.
由于此 API 调用是异步的,因此在收到此数据时,表格已经设置完毕。我有一个 class 级数组设置,用于填充来自 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") {
[=10=].title = "Choose Job"
[=10=].options = jobs.map { [=10=].description }
[=10=].selectorTitle = "Choose..."
}.onPresent { from, to in
to.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: from, action: #selector(CreateEventViewController.multipleSelectorDone(_:)))
}
}
}
是否有某种方法可以刷新或重新加载特定行或整个表单的数据?
更新 1
根据下面凯文的
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()
但无济于事。
在 FAQ 部分的 README 底部有一个关于重新加载的参考
How to set the form values using a dictionary
... If the form was already displayed we have to reload the visible rows either by reloading the table view
tableView.reloadData()
or invokingupdateCell()
to each visible row.
但是,我什至认为没有必要。更新 self.jobs
后只需调用 setupForm()
。
从FormViewController
源码可以看出,设置[=16=]时,会重新加载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()
}
}
}
我找到了!您必须将 .cellUpdate {...}
闭包添加到该行,并在其中将值分配给 options
属性。像这样,
<<< PushRow<String>("Jobs") {
[=10=].title = "Choose Job"
[=10=].options = jobs.map { [=10=].description }
[=10=].selectorTitle = "Choose..."
}
.cellUpdate { cell, row in
row.options = self.jobs.map { [=10=].description }
}