为一行动态加载选项
Posted
技术标签:
【中文标题】为一行动态加载选项【英文标题】:Dynamically loading options for a row 【发布时间】:2016-04-04 20:07:23 【问题描述】:这是一个与名为 Eureka 的 Swift 开源项目相关的问题,我在 SO 上发布了这个问题,因为他们在这里监控他们的标签。
好的,所以我在视图控制器的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()
,但无济于事。
【问题讨论】:
【参考方案1】:我找到了!您必须将 .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
【讨论】:
太好了,我遇到了同样的问题。是否可以传递一个对象,以便在选择行时可以获得对象的所有属性?有什么线索吗? 是的,你可以。使您的对象符合 Equatable 协议,然后您可以将自己的对象传递给该行。喜欢 PushRow在 FAQ 部分的 README 底部有一个关于重新加载的参考
如何使用字典设置表单值
... 如果表格是 已经显示我们必须重新加载可见行 重新加载表格视图
tableView.reloadData()
或调用updateCell()
到每个可见行。
但是,我什至认为这没有必要。更新self.jobs
后只需致电setupForm()
。
从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()
【讨论】:
谢谢。我在自述文件中完全忽略了这一点。不幸的是,我仍然面临同样的问题。我更新了我的问题。 您是否尝试在添加setupForm()
之后添加self.jobs = jobs
?表单是基于self.jobs
生成的,所以需要在更新tableview之前更新。以上是关于为一行动态加载选项的主要内容,如果未能解决你的问题,请参考以下文章