Wenn Sie die Zurück-Taste drücken, ruft der Navigationscontroller navigationController(willShowViewController:)
auf, damit Sie die Daten zurück zum ursprünglichen Ansichtscontroller übertragen können.
Verwenden von UINavigationControllerDelegate
:
class DetailsViewController: UIViewController, UINavigationControllerDelegate {
// ^
var data: [String] = [] // Important!
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.delegate = self
data = ["data has changed!"]
}
}
Swift 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
}
}
}
Swift 3: Ein Beispiel wird unten gezeigt
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
}
}
In diesem Beispiel verwendet der Schlüssel UINavigationControllerDelegate
und legt den Delegierten des Navigationscontrollers fest (in diesem Fall ist es self
). Nachdem Sie dies getan haben, können Sie die Daten mit der Schaltfläche Zurück an Ihren ursprünglichen View-Controller zurücksenden.
Persönlich bevorzuge ich eine Klasse für meine Daten mit:
eine benutzerdefinierte Klasse für Ihre Daten verwenden:
class Data {
var array: [String] = []
}
Fortschritt View-Controller:
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
}
}
}
Einzelheiten View-Controller:
class DetailsViewController: UIViewController {
var data = Data()
override func viewDidLoad() {
super.viewDidLoad()
data.array = ["data has changed!"]
}
}
Im letzten Beispiel müssen Sie sich keine Gedanken über die Weitergabe von Daten machen. Wenn Sie die Daten ändern, haben die Controller, die dieselbe Klasse verwenden, ebenfalls die Änderungen.
Statt zurückzugeben Sie können auch eine benutzerdefinierte Klasse mit den Arrays als Klasseneigenschaften erstellen. Wenn Sie diese also im Trainingsansicht-Controller ändern, werden sie auch im Fortschrittsansicht-Controller geändert. – Eendje