Fehler mit UITableView

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

Macoun 2019 - Frühbucherrabatt bis 26.7.2019

  • Fehler mit UITableView

    Hallo zusammen,

    ich habe vor ein paar Tagen mit dem coden in Swift angefangen, da mich das Thema Software-Entwicklung schon immer sehr interessiert hat und ich mich schon sehr lange damit beschäftigen wollte. Dies habe ich dann endlich mal in die Tat umgesetzt und mich mit Büchern und Udemy Kursen eingedeckt. :)

    Ich habe nun ein Problem, was ich nach zwei Tagen leider immer noch nicht gelöst bekommen habe ich hoffe, dass Ihr mir hier weiterhelfen könnt.

    Ich habe zwei TableView Controller, der eine gibt eine "Hauptkategorie" aus einem Array aus und der zweite dann eine "Unterkategorie" aus einem Array.


    Hauptkategorie "Rind" (klicken) -> Unterkategorie "Filet"

    Nun ist es so, dass er den zweiten tableview Controller "durchläuft" und zweimal aufruft. Ist schwer zu erklären... Ich stelle mal den Code der beiden Controller hier ein:

    Erster TableViewController:

    Quellcode

    1. //
    2. // mainCategorieTVC.swift
    3. // Garzeiten
    4. //
    5. // Created by René Corten on 09.05.19.
    6. // Copyright © 2019 René Corten. All rights reserved.
    7. //
    8. import UIKit
    9. class mainCategorieTVC: UITableViewController {
    10. // Kategorien anlegen
    11. var categories = ["Rind", "Schwein"]
    12. // Drückt der Nutzer auf Zeile 1, wird der Index 0 an den zweiten Controller gesendet.
    13. var categorieIndex: Int = 0
    14. override func viewDidLoad() {
    15. super.viewDidLoad()
    16. tableView.delegate = self
    17. tableView.dataSource = self
    18. // Zeilenhöhe anpassen
    19. tableView.rowHeight = 80.0
    20. }
    21. // Vorbereiten der Übergabe an zweiten Viewcontroller
    22. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    23. if segue.identifier == "showSubCategorieTVC" {
    24. let subCategorieVC = segue.destination as! subCategorieTVC
    25. subCategorieVC.categorieIndex = categorieIndex
    26. }
    27. }
    28. // MARK: - Table view data source
    29. override func numberOfSections(in tableView: UITableView) -> Int {
    30. // #warning Incomplete implementation, return the number of sections
    31. return 1
    32. }
    33. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    34. // #warning Incomplete implementation, return the number of rows
    35. return categories.count
    36. }
    37. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    38. categorieIndex = indexPath.row
    39. performSegue(withIdentifier: "showSubCategorieTVC", sender: self)
    40. print("Du hast auf die Tabellenzeile \(indexPath.row) gedrückt")
    41. }
    42. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    43. let cell = tableView.dequeueReusableCell(withIdentifier: "mainCategorieCell", for: indexPath)
    44. cell.textLabel?.text = categories[indexPath.row]
    45. return cell
    46. }
    47. }
    Alles anzeigen

    Zweiter TableViewController

    Quellcode

    1. //
    2. // subCategorieTVC.swift
    3. // Garzeiten
    4. //
    5. // Created by René Corten on 09.05.19.
    6. // Copyright © 2019 René Corten. All rights reserved.
    7. //
    8. import UIKit
    9. class subCategorieTVC: UITableViewController {
    10. let categorieData = [
    11. ["Filet"],
    12. ["Hüfte"]
    13. ]
    14. // Erhält den Wert vom ersten ViewController beim Übergang (segue)
    15. var categorieIndex: Int = 0
    16. override func viewDidLoad() {
    17. super.viewDidLoad()
    18. tableView.delegate = self
    19. tableView.dataSource = self
    20. }
    21. // MARK: - Table view data source
    22. override func numberOfSections(in tableView: UITableView) -> Int {
    23. // #warning Incomplete implementation, return the number of sections
    24. return 1
    25. }
    26. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    27. // #warning Incomplete implementation, return the number of rows
    28. return categorieData[categorieIndex].count
    29. }
    30. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    31. print("Du hast auf die Tabellenzeile \(indexPath.row) gedrückt")
    32. }
    33. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    34. let cell = tableView.dequeueReusableCell(withIdentifier: "subCategorieCell", for: indexPath)
    35. cell.textLabel?.text = categorieData[categorieIndex][indexPath.row]
    36. return cell
    37. }
    38. }
    Alles anzeigen
    Ich hoffe ich konnte mich klar genüg ausdrücken und freue mich über eine Antwort und Hilfestellung.

    Vielen Dank!
    Als Neuling in der Softwareentwicklung durchlebe ich zur Zeit vielen Höhen und mindestens genauso viele Tiefen... ABER: Es macht einfach Riesenspaß zu coden!
  • Mac & i Test Abo
  • matz schrieb:

    Hi, check mal ob du deine Segue im Storyboard vom ViewController -> ViewController oder von der TableViewCell -> ViewController verbunden hast ... könnte schon das Problem sein. Wenn du sie manuell triggerst, leg sie von ViewController -> ViewController an
    Wahnsinn! Genau das war das Problem.

    Ich habe die Segue nun von ViewComntroller zu ViewController eingerichtet und. nun geht es.

    Ich danke dir sehr!
    Als Neuling in der Softwareentwicklung durchlebe ich zur Zeit vielen Höhen und mindestens genauso viele Tiefen... ABER: Es macht einfach Riesenspaß zu coden!
  • Hallo Matz,

    nun möchte ich eine Art DetailView in einem dritten ViewController anzeigen und die die geklickte Reihe aus dem zweiten TableViewController übergeben.

    Ich erhalte hier allerdings den Fehler: Cannot assign value of type '[String]' to type 'String?'

    Kannst du mir hier noch mal auf die Sprünge helfen? Ich denke, dass ich mir das Thema "Arrays" noch mal genauer ansehen muss ?! :(


    Hier der Code

    Quellcode

    1. //
    2. // subCategorieTVC.swift
    3. // Garzeiten
    4. //
    5. // Created by René Corten on 09.05.19.
    6. // Copyright © 2019 René Corten. All rights reserved.
    7. //
    8. import UIKit
    9. class subCategorieTVC: UITableViewController {
    10. let categorieData = [
    11. ["Eins"],
    12. ["Zwei"],
    13. ["Drei"],
    14. ["Vier"],
    15. ["Fünf"],
    16. ]
    17. // Erhält den Wert vom ersten ViewController beim Übergang (segue)
    18. var categorieIndex: Int = 0
    19. override func viewDidLoad() {
    20. super.viewDidLoad()
    21. tableView.delegate = self
    22. tableView.dataSource = self
    23. }
    24. // MARK: - Table view data source
    25. override func numberOfSections(in tableView: UITableView) -> Int {
    26. // #warning Incomplete implementation, return the number of sections
    27. return 1
    28. }
    29. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    30. // #warning Incomplete implementation, return the number of rows
    31. return categorieData[categorieIndex].count
    32. }
    33. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    34. }
    35. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    36. if segue.identifier == "showDetailVC" {
    37. let selectedItemDetailView = segue.destination as! detailVC
    38. selectedItemDetailView.selectedItem = categorieData[(tableView.indexPathForSelectedRow!.row)]
    39. }
    40. }
    41. // Ausgabe der Zeilen
    42. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    43. let cell = tableView.dequeueReusableCell(withIdentifier: "subCategorieCell", for: indexPath)
    44. cell.textLabel?.text = categorieData[categorieIndex][indexPath.row]
    45. return cell
    46. }
    47. }
    Alles anzeigen
    Den Fehler erhalt ich in Zeile 43.
    Als Neuling in der Softwareentwicklung durchlebe ich zur Zeit vielen Höhen und mindestens genauso viele Tiefen... ABER: Es macht einfach Riesenspaß zu coden!
  • Super, nach dem ändern in folgenden Code geht es nun:

    Quellcode

    1. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    2. if segue.identifier == "showDetailVC" {
    3. let selectedItemDetailView = segue.destination as! detailVC
    4. selectedItemDetailView.categorieIndex = categorieIndex
    Als Neuling in der Softwareentwicklung durchlebe ich zur Zeit vielen Höhen und mindestens genauso viele Tiefen... ABER: Es macht einfach Riesenspaß zu coden!
  • Hallo noch mal in die Runde,

    ich habe diesmal kein Fehler, sondern eine Frage, ob es nicht geschickter gemacht werden kann, als meine Lösung.

    Ich würde gerne den self.tite dynamisch setzen und nicht für alles eine if Abfrage machen. Mir kommt der Code sehr nach "Spaghetti Code" vor..

    Wir würdet Ihr das lösen?

    Quellcode

    1. //
    2. // subCategorieTVC.swift
    3. // Garzeiten
    4. //
    5. // Created by René Corten on 09.05.19.
    6. // Copyright © 2019 René Corten. All rights reserved.
    7. //
    8. import UIKit
    9. class subCategorieTVC: UITableViewController {
    10. let categorieData = [
    11. ["Eins", "Zwei"],
    12. ["Zwei"],
    13. ["Drei"],
    14. ["Vier"],
    15. ["Fünf"],
    16. ]
    17. // Erhält den Wert vom ersten ViewController beim Übergang (segue)
    18. var categorieIndex: Int = 0
    19. override func viewDidLoad() {
    20. super.viewDidLoad()
    21. tableView.delegate = self
    22. tableView.dataSource = self
    23. }
    24. // MARK: - Table view data source
    25. override func numberOfSections(in tableView: UITableView) -> Int {
    26. // #warning Incomplete implementation, return the number of sections
    27. return 1
    28. }
    29. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    30. // #warning Incomplete implementation, return the number of rows
    31. return categorieData[categorieIndex].count
    32. }
    33. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    34. categorieIndex = indexPath.row
    35. performSegue(withIdentifier: "showDetailVC", sender: self)
    36. }
    37. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    38. if segue.identifier == "showDetailVC" {
    39. let selectedItemDetailView = segue.destination as! detailVC
    40. selectedItemDetailView.categorieIndex = categorieIndex
    41. }
    42. }
    43. // Ausgabe der Zeilen
    44. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    45. let cell = tableView.dequeueReusableCell(withIdentifier: "subCategorieCell", for: indexPath)
    46. cell.textLabel?.text = categorieData[categorieIndex][indexPath.row]
    47. return cell
    48. }
    49. }
    Alles anzeigen



    Quellcode

    1. //
    2. // detailVC.swift
    3. // Garzeiten
    4. //
    5. // Created by René Corten on 10.05.19.
    6. // Copyright © 2019 René Corten. All rights reserved.
    7. //
    8. import UIKit
    9. class detailVC: UIViewController {
    10. var categorieIndex: Int = 0
    11. var selectedItemDetailView: String?
    12. var name: String?
    13. override func viewDidLoad() {
    14. super.viewDidLoad()
    15. if categorieIndex == 0 {
    16. self.title = "Eins"
    17. }
    18. if categorieIndex == 1 {
    19. self.title = "Zwei"
    20. }
    21. if categorieIndex == 2 {
    22. self.title = "drei"
    23. }
    24. // Zur Prüfung
    25. print("CategorieIndex ist \(categorieIndex)")
    26. }
    27. }
    Alles anzeigen
    Als Neuling in der Softwareentwicklung durchlebe ich zur Zeit vielen Höhen und mindestens genauso viele Tiefen... ABER: Es macht einfach Riesenspaß zu coden!