3

これは、 Eurekaと呼ばれる Swift オープン ソース プロジェクトに関連する質問です。ここでタグを監視しているため、SO にこの質問を投稿しています。

viewDidLoadでは、View Controller のメソッドでフォームを作成します。同時に、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

以下のケビンの回答に従って、コードを次のように変更しました。

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()てみましたが、役に立ちませんでした。

4

2 に答える 2

1

FAQセクションのREADMEの下部に、リロードへの参照があります

辞書を使用してフォームの値を設定する方法

... フォームが既に表示されている場合は、テーブル ビューを再読み込みするか、表示されている各行tableView.reloadData()を呼び出し updateCell()て、表示されている行を再読み込みする必要があります。

しかし、私はそれが必要だとさえ思いません。setupForm()更新後に呼び出すだけですself.jobs

を設定すると、テーブルビューがリロードさFormViewControllerれることがソース コードからわかります。form

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()
        }
    }
}
于 2016-04-04T20:22:57.187 に答える