【问题标题】: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(),但无济于事。

【问题讨论】:

    标签: ios swift swift2.2 eureka-forms


    【解决方案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("Jobs")
    • 有没有示例代码可以看。非常感谢
    【解决方案2】:

    在 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之前更新。
    猜你喜欢
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多