戻るボタンを押すと、ナビゲーション コントローラーが呼び出さ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!"]
}
}
最後の例では、データの受け渡しについて心配する必要はありません。データを変更すると、同じクラスを使用するコントローラーにも変更が適用されます。