19

私はこの状況にいます:

img1

セグエの準備を使用して、プログレステーブルから詳細演習に4つの配列を渡していますが、正常に動作します! 問題は、データを Detail Exercise Controller から Progress Table Controller に戻そうとしたときに始まります。デフォルトのナビゲーションの戻るボタンを使用して、親ビューに戻りたいと思います。実際に私はこのコードを使用していますが、うまくいきません。データは子ビューから親ビューに渡されますが、進行状況テーブルに結果が表示されません。更新する必要があるようですが、reloadData も試しましたviewDidLoad の後、それは機能しません。なにか提案を?ありがとうございました。

override func viewWillDisappear(animated : Bool) {
    super.viewWillDisappear(animated)

    if (self.isMovingFromParentViewController()){
        print("n'drio")

        let historyView = self.storyboard!.instantiateViewControllerWithIdentifier("historyView") as! HistoryTableViewController
        historyView.isFirstTime = false
        historyView.arrayData = arrayDataDetails
        historyView.arrayRipetizioni = arrayRipetizioniDetails
        historyView.arrayPeso = arrayPesoDetails
        historyView.arrayRecupero = arrayRecuperoDetails
        historyView.tableView.reloadData()
    }
}
4

4 に答える 4

44

戻るボタンを押すと、ナビゲーション コントローラーが呼び出さnavigationController(willShowViewController:)れるので、これを使用してデータを最初のビュー コントローラーに戻すことができます。以下に例を示します。

使用UINavigationControllerDelegate:

class DetailsViewController: UIViewController, UINavigationControllerDelegate {
                                                        //     ^
    var data: [String] = []                             // Important!

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationController?.delegate = self

        data = ["data has changed!"]
    }
}

スウィフト 2:

extension DetailsViewController: UINavigationControllerDelegate {
    func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
        if let controller = viewController as? ProgressTableViewController {
            controller.data = data    // Here you pass the data back to your original view controller
        }
    }
}

スウィフト 3:

extension DetailsViewController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        (viewController as? ProgressTableViewController)?.data = data // Here you pass the to your original view controller
    }
}

この例では、キーは を使用しUINavigationControllerDelegate、ナビゲーション コントローラーのデリゲートを設定しています (この場合はself)。これが完了したら、[戻る] ボタンを使用してデータを最初のビュー コントローラーに戻すことができます。

個人的には、データにクラスを使用することを好みます。

データにカスタム クラスを使用する:

class Data {
    var array: [String] = []
}

プログレス ビュー コントローラ:

class ProgressTableViewController: UITableViewController {

    var data = Data()

    override func viewDidLoad() {
        super.viewDidLoad()

        data.array = ["some data"]
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        tableView.reloadData()
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.array.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()

        cell.textLabel?.text = data.array[indexPath.row]

        return cell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        performSegue(withIdentifier: "exerciseSegue", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "exerciseSegue" {
            let destination = segue.destinationViewController as! DetailsViewController
            destination.data = data
        }
    }
}

詳細ビュー コントローラ:

class DetailsViewController: UIViewController {

    var data = Data()

    override func viewDidLoad() {
        super.viewDidLoad()

        data.array = ["data has changed!"]
    }
}

最後の例では、データの受け渡しについて心配する必要はありません。データを変更すると、同じクラスを使用するコントローラーにも変更が適用されます。

于 2016-01-22T22:24:34.137 に答える
4

通常、プロトコルとデリゲートは、画面間でデータをやり取りするために使用されます。

// Define a delegate that is known to both view controllers
protocol DetailsExerciseDelegate {
    func detailsWillDisappear(...);
}

class DetailsExerciseViewController {
    // Accept the delegate as a property on the details view controller
    var delegate : DetailsExerciseDelegate

    override func viewWillDisappear(animated : Bool) {
        super.viewWillDisappear(animated)

        // When you want to send data back to the caller
        // call the method on the delegate
        if let delegate = self.delegate {
            delegate.detailsWillDisappear(/* your data in one or more parameters */)
        }
    }
}

// Implement the delegate by adding the required function
class ProgressTableViewController: DetailsExerciseDelegate {
    ...

    func detailsWillDisappear(...) {
        // When the child calls the function, update the screen
        historyView.isFirstTime = false
        historyView.arrayData = arrayDataDetails
        historyView.arrayRipetizioni = arrayRipetizioniDetails
        historyView.arrayPeso = arrayPesoDetails
        historyView.arrayRecupero = arrayRecuperoDetails
        historyView.tableView.reloadData()
    }

    override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        if segue!.identifier == "DetailsExcercise" {
            // And finally, when launching the child view,
            // make sure to set the delegate.
            let viewController = segue!.destinationViewController as DetailsExerciseViewController
            viewController.delegate = self
        }
    }
}

そうは言っても、戻るボタンをクリックしたときにデータを保存しようとするのは標準的ではないようです。代わりに「完了」でこれを実行したくないですか?

于 2016-01-22T21:22:34.150 に答える