动态加载一行的选项

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 }
}