Array-Daten übergeben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Array-Daten übergeben

    Hallo,

    ich suche gerade nach Möglichkeiten um Informationen eines Arrays von A nach B zu transportieren. Beispielsweise habe ich aktuell eine TableView die verschiedenste User anzeigt die in einem Array gespeichert sind. Klicke ich nun auf eine Zelle soll sich eine neue View mit sämtlichen Informationen zu dem jeweiligen User öffnen. Jetzt bin ich mir leider unsicher da ich noch ziemlicher Anfänger in Swift bin und eigentlich bei PHP zuhause war. Deswegen wollte ich ganz grob einfach mal fragen welche Möglichkeiten der Daten-Weitergabe ich so alles habe und mit welchen Funktionen ich arbeiten muss ?:)
  • Du erstellst z. B. in dem empfangenden Objekt (etwa dem ViewController) ein entsprechendes Property vom Typ Array. Bevor Du nun in die neue View (nach Instanzieren des ViewControllers) wechselst, weist Du diesem Property Dein „abgebendes“ Array zu. Fettich!

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Von der Beschreibung würde ich eher darauf tippen, dass Du den "ausgewählten" Eintrag, also den User, aus dem Array an den neuen ViewController übergeben möchtest.

    Wenn Du ein Storyboard und Seques verwendest, dann schau Dir mal die Methode prepare(for:sender:) an. Diese Methode musst Du in dem ViewController mit dem TableView implementieren und kannst darin dann den "ausgewählten" Eintrag aus dem Array an den neuen ViewController übergeben.
  • Danke die prepare-Methode ist genau das wonach ich gesucht habe. Habe das ganze gleich mal ausprobiert und es funktioniert auch, nur leider mit einem kleinen Haken den ich gerade nicht zu bekämpfen weiß :/

    Ich habe ein Array:

    Quellcode

    1. var users: [User] = [
    2. User(profilePicture: "bild_user29Lifestyle" ,name: "Max Mustermann", question: "Was findet ihr am besten ?"),
    3. User(profilePicture: "bild_user29Lifestyle1", name: "Bodo Bodyguard", question: "Links oder Rechts ?"),
    4. User(profilePicture: "bild_user29Lifestyle2-1", name: "Klaus Knarre", question: "Wie findet ihr das ?")
    5. ]

    Jetzt sieht meine prepare-Methode wie folgt aus:

    Quellcode

    1. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    2. var DestViewController : VotingViewController = segue.destination as! VotingViewController
    3. for information in users {
    4. DestViewController.LabelText = information.question
    5. }
    6. }
    Leider wird egal auf welche User-Zelle ich klicke immer die selbe Frage angezeigt. Das wird vermutlich daran liegen da der ViewController nicht weiß welche Zelle ausgewählt ist. Glaube es gibt zwei Methoden die mir weiterhelfen können, didSelectRow und willSelectRow oder ?
    Nur wie baue ich da dann meine prepare-Methode mit ein ?
  • Überlege mal genau, was Du in der Schleife im „prepare“ machst: Du weist ein in der gleiche Variablen nacheinander die Fragen der drei Benutzer zu. Bei Ende der Schleifendurchläufe ist natürlich der letzte, dritte Wert in LabelText gespeichert (Variablen- / Methoden-Namen sollten übrigens mit Kleinbuchstaben beginnen).

    Frage doch in der Methode die TableView, welche Zeile ausgewählt ist ... dafür gibt es eine Methode. Dann weißt Du, welches Element des Arrays verwendet werden muss: Analog zum Füllen der Zeilen.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Super vielen Dank euch beiden :D funktioniert jetzt alles so wie ich mir das vorstelle !!!


    Quellcode

    1. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    2. if(segue.identifier == "votingSegue") {
    3. if let selectedRowIndex = self.homeTableView.indexPathForSelectedRow {
    4. let DestViewController : VotingViewController = segue.destination as! VotingViewController
    5. DestViewController.moveID = selectedRowIndex.row
    6. for (index, information) in users.enumerated() {
    7. if index == selectedRowIndex.row {
    8. DestViewController.profilePicture = UIImage(named: information.profilePicture)!
    9. DestViewController.questionLabelText = information.question
    10. DestViewController.titleName = information.name
    11. print("\(index): '\(information.question)'")
    12. }
    13. }
    14. }
    15. }
    16. }
    Alles anzeigen
    So funktioniert das ganze jetzt für mich, gibts vielleicht Verbesserungsvorschläge ? :)
  • ThisIsBeat schrieb:

    gibts vielleicht Verbesserungsvorschläge ? :)

    Ja, einige!

    Ich pick jetzt nur mal eins raus.

    ThisIsBeat schrieb:

    Quellcode

    1. for (index, information) in users.enumerated() {
    2. if index == selectedRowIndex.row {
    3. DestViewController.profilePicture = UIImage(named: information.profilePicture)!
    4. DestViewController.questionLabelText = information.question
    5. DestViewController.titleName = information.name
    6. print("\(index): '\(information.question)'")
    7. }

    Stell Dir vor, Du hast eine Million User in Deinem users-Array. Warum iterierst Du jedesmal durch das komplette Array, wenn Dich doch nur genau ein einziger vorher bekannter Index in dem Array interessiert?

    -> let user = users[selectedRowIndex.row] und dann weiter mit user.information.question, user.information.name, etc.

    Und doch noch was: DestViewController ist eine Instanz, bzw. ein Variablenname. Die sollten in Swift immer mit einem Kleinbuchstaben anfangen, sonst verwechselt man das mit static properties einer Klasse. Aber das wurde weiter upthread schon anmoniert…
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • OK. Nachdem @MyMattes mal wieder schneller war und letztendlich ins gleiche Horn geblasen hat, dann doch noch was anderes.

    ThisIsBeat schrieb:

    @MyMattes

    Quellcode

    1. if(segue.identifier == "votingSegue") { }
    Die runden Klammern beim if kann (und sollte) man sich in Swift sparen. Ist nur unnötiger Buchstabensalat.

    ThisIsBeat schrieb:

    Quellcode

    1. if let selectedRowIndex = self.homeTableView.indexPathForSelectedRow {
    2. // eingerückt
    3. }
    Auf das self kann man hier verzichten (unnötiger Buchstabensalat). Wenn man statt if let hier guard let verwendet, kann man sich eine Einrückungsebene sparen. Also:

    Quellcode

    1. guard let selectedRowIndex = homeTableView.indexPathForSelectedRow else { return }
    2. // ohne Einrückung
    Diese qualvollen immer tiefer verlaufenden Einrückungen nennt man in der Fachsprache übrigens Pyramid of doom.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • Nein. Natürlich nicht. Die Property ist immer klein. Drauf will ich ja hinaus. Bei einer statischen Property gibt man ja den Typ/ die Klasse mit an und die schreibt man ja in der Regel groß (z.B. Int.max).
    Ach! Herrje, ich merke gerade, daß static in Swift und C wohl unterschiedliche Bedeutungen haben… o_O
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • torquato schrieb:



    Stell Dir vor, Du hast eine Million User in Deinem users-Array. Warum iterierst Du jedesmal durch das komplette Array, wenn Dich doch nur genau ein einziger vorher bekannter Index in dem Array interessiert?

    -> let user = users[selectedRowIndex.row] und dann weiter mit user.information.question, user.information.name, etc.

    Und doch noch was: DestViewController ist eine Instanz, bzw. ein Variablenname. Die sollten in Swift immer mit einem Kleinbuchstaben anfangen, sonst verwechselt man das mit static properties einer Klasse. Aber das wurde weiter upthread schon anmoniert…
    Okay ja stimmt ist eher ungünstig durch das gesamte Array zu fahren doch irgendwie will das bei mir nicht so richtig klappen. Wie bau ich den deine user-Variable da jetzt ein ? Ich gehe jetzt mal davon aus das du in der for in Schleife meinst oder ?
  • Also ungefähr so (ungetestet):

    Quellcode

    1. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    2. if segue.identifier == "votingSegue" {
    3. guard
    4. let index = homeTableView.indexPathForSelectedRow?.row,
    5. let destViewController = segue.destination as? VotingViewController
    6. else { return }
    7. destViewController.moveID = index
    8. let info = users[index].information
    9. destViewController.profilePicture = UIImage(named: info.profilePicture)!
    10. destViewController.questionLabelText = info.question
    11. destViewController.titleName = info.name
    12. print("\(index): '\(info.question)'")
    13. }
    14. }
    Alles anzeigen
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?