Hallo zusammen,
ich habe ein Verständnis Problem zum Thema Datenaustausch zwischen zwei ViewController.
Ich habe versucht mich bei Dr. Google schlau zu machen, habe auch einiges gelesen (Properties, Segues, Notification Center), probiert aber ich komme irgendwie nicht weiter und mir fehlt das prinzipielle Verständnis wie sich so etwas einfach realisieren lässt.
Hier kurz zur Erläuterung was ich machen möchte.
Ich habe eine App mit einem MainViewController. Hier werden Daten mittels einen API aus dem Internet geladen, verarbeitet und in Labels dargestellt.Dann wollte ich ein SideMenu in dem ich dann einen zweiten, InfoViewController, habe der zusätzliche Informationen darstellen soll. Einige der Infos die ich darstellen möchte wurden im MainViewController über die API geladen bzw. errechnet.
Ich kenne das von Java, in der man über eine s.g. Model Class mit getter und setter Methoden die Daten speichert (set-) und dann wieder abholt (get-).
Nun fehlt mir die Idee wie ich das in Swift realisieren kann. Alles was ich bis jetzt gelesen habe erscheint mir sehr komplex (z.B. Notification Center) für das was ich benötige.
Kann mir jemand an Hand eines kurzen Beispiel erläutern wie Informationen von Controller A für Controller B bereitstellen kann?
Gruß
Ralf
Hier noch ein bisschen Code um die Frage vielleicht ein bisschen klarer zu machen. Das mit dem SideMenu habe ich mir aus Beiträgen von StackOverflow und Tutorials "zusammen gebaut", es ist also durchaus möglich das hier einiges nicht wirklich klug ist .. bin daher um jeden Ratschlag dankbar ... auch wenn es letztendlich endet in: Vergiss es
Alles anzeigen
Alles anzeigen
In dem InfoViewController habe ich dann versucht über die Property text "Daten auszutauschen". Im ViewController habe ich dann folgendes versucht:
Allerdings, egal wo in ViewController ich den Code rein schreibe wird dieser beim Aufruf des InfoViewController nicht auf der Konsole ausgegeben
Vermutlich ganz falscher Ansatz ...
Update:
Ich habe gerade gemerkt das der InfoViewController schon erstellt wird bevor ich die Property rein gebe und somit natürlich nicht die Ausgabe gemacht wird da der print(text) schon mit dem Default String aus InfoViewController (var text:String = "") gemacht wird.
Dann wird es vermutlich doch irgendwie auf Observer hinauslaufen .. ?? ... ??
Gruß
Ralf
ich habe ein Verständnis Problem zum Thema Datenaustausch zwischen zwei ViewController.
Ich habe versucht mich bei Dr. Google schlau zu machen, habe auch einiges gelesen (Properties, Segues, Notification Center), probiert aber ich komme irgendwie nicht weiter und mir fehlt das prinzipielle Verständnis wie sich so etwas einfach realisieren lässt.
Hier kurz zur Erläuterung was ich machen möchte.
Ich habe eine App mit einem MainViewController. Hier werden Daten mittels einen API aus dem Internet geladen, verarbeitet und in Labels dargestellt.Dann wollte ich ein SideMenu in dem ich dann einen zweiten, InfoViewController, habe der zusätzliche Informationen darstellen soll. Einige der Infos die ich darstellen möchte wurden im MainViewController über die API geladen bzw. errechnet.
Ich kenne das von Java, in der man über eine s.g. Model Class mit getter und setter Methoden die Daten speichert (set-) und dann wieder abholt (get-).
Nun fehlt mir die Idee wie ich das in Swift realisieren kann. Alles was ich bis jetzt gelesen habe erscheint mir sehr komplex (z.B. Notification Center) für das was ich benötige.
Kann mir jemand an Hand eines kurzen Beispiel erläutern wie Informationen von Controller A für Controller B bereitstellen kann?
Gruß
Ralf
Hier noch ein bisschen Code um die Frage vielleicht ein bisschen klarer zu machen. Das mit dem SideMenu habe ich mir aus Beiträgen von StackOverflow und Tutorials "zusammen gebaut", es ist also durchaus möglich das hier einiges nicht wirklich klug ist .. bin daher um jeden Ratschlag dankbar ... auch wenn es letztendlich endet in: Vergiss es
C-Quellcode
- class ViewController: UIViewController, MenuControllerDelegate {
- private var sideMenu: SideMenuNavigationController?
- private let aboutController = AboutViewController()
- private let infoController = InfoViewController()
- ...
- ...
- func loadData() {
- ...
- Hier werden die Daten vom API geholt, verarbeitet und in Labels auf dem ViewController dargestellt ...
- ...
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- self.view.backgroundColor = UIColor(patternImage: UIImage(named: "SandSeamless.jpg")!)
- // Set label font
- queryDateActual.font = UIFont(name:"AppleSDGothicNeo-SemiBold", size: 25)
- investDateEnd.font = UIFont(name:"AppleSDGothicNeo-SemiBold", size: 25)
- showProfitLossEnd.font = UIFont(name:"AppleSDGothicNeo-SemiBold", size: 40)
- showProfitLossActual.font = UIFont(name:"AppleSDGothicNeo-SemiBold", size: 40)
- // Set showProfitLostEnd label layout
- showProfitLossEnd.textColor = UIColor.white
- showProfitLossEnd.layer.cornerRadius = 25
- showProfitLossEnd.layer.masksToBounds = true
- // Set showProfitLostActual label layout
- showProfitLossActual.textColor = UIColor.white
- showProfitLossActual.layer.cornerRadius = 25
- showProfitLossActual.layer.masksToBounds = true
- let menu = MenuController(with: SideMenuItem.allCases)
- menu.delegate = self
- sideMenu = SideMenuNavigationController(rootViewController: menu)
- sideMenu?.leftSide = true
- sideMenu?.setNavigationBarHidden(true, animated: false)
- SideMenuManager.default.leftMenuNavigationController = sideMenu
- SideMenuManager.default.addPanGestureToPresent(toView: view)
- addChildControllers()
- // load Data
- loadData()
- }
- private func addChildControllers() {
- addChild(aboutController)
- addChild(infoController)
- view.addSubview(aboutController.view)
- view.addSubview(infoController.view)
- aboutController.view.frame = view.bounds
- infoController.view.frame = view.bounds
- aboutController.didMove(toParent: self)
- infoController.didMove(toParent: self)
- aboutController.view.isHidden = true
- infoController.view.isHidden = true
- }
- @IBAction func didTapMenuButton() {
- present(sideMenu!, animated: true)
- }
- func didSelectMenuItem(named: SideMenuItem) {
- sideMenu?.dismiss(animated: true, completion: nil)
- // Don't show Name of Navigation Item (Home, About ..., etc.) in the Navigation Bar as
- // Title. Uncomment the next line to show the Title.
- //title = named.rawValue
- switch named {
- case .home:
- aboutController.view.isHidden = true
- infoController.view.isHidden = true
- case .info:
- aboutController.view.isHidden = true
- infoController.view.isHidden = false
- case .about:
- aboutController.view.isHidden = false
- infoController.view.isHidden = true
- }
- }
- }
C-Quellcode
- class InfoViewController: UIViewController {
- /// The text property for "Passing data forward with properties"
- var text:String = ""
- override func viewDidLoad() {
- super.viewDidLoad()
- //view.backgroundColor = .red
- view.backgroundColor = UIColor(patternImage: UIImage(named: "SandSeamless.jpg")!)
- print(text)
- }
- }
Allerdings, egal wo in ViewController ich den Code rein schreibe wird dieser beim Aufruf des InfoViewController nicht auf der Konsole ausgegeben
Vermutlich ganz falscher Ansatz ...
Update:
Ich habe gerade gemerkt das der InfoViewController schon erstellt wird bevor ich die Property rein gebe und somit natürlich nicht die Ausgabe gemacht wird da der print(text) schon mit dem Default String aus InfoViewController (var text:String = "") gemacht wird.
Dann wird es vermutlich doch irgendwie auf Observer hinauslaufen .. ?? ... ??
Gruß
Ralf
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von ralfb ()