Überschreiben von TableView im ViewController

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

  • Überschreiben von TableView im ViewController

    Hallo,
    ich habe einen ViewController und darauf habe ich mir ein TableView gezogen

    Wie kann ich jetzt die Funktionen des TableView überschreiben?


    Wenn ich z.B. dies schreibe:
    class OeeChartViewController: UIViewController {
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return TableData.count

    }

    Hier bekomme ich von Xcode diese Fehlermeldung:
    method does not override any method from its superclass
  • Okay, wenn ich das override weglasse bekomme ich schonmal keinen Fehler beim kompilieren, jedoch werden wir auch keine Daten angezeigt

    Was mache ich falsch...TableData hat Einträge, habe mir einen ButtonClick Ereignis hinzugefügt wo ich sehe, dass es mehrere Datensätze enthält:

    Quellcode

    1. import UIKit
    2. import Charts
    3. class OeeChartViewController: UIViewController {
    4. var TableData = [SetMenue]()
    5. @IBAction func onButtonClick(_ sender: Any) {
    6. print("bbbbbb")
    7. print(TableData.count)
    8. tableView.reloadData()
    9. }
    10. @IBOutlet weak var lineChart: BarChartView!
    11. @IBOutlet weak var tableView: UITableView!
    12. override func viewDidLoad() {
    13. super.viewDidLoad()
    14. self.TableData.removeAll()
    15. get_data_from_url(test: "0")
    16. //self.tableView.reloadData()
    17. // Do any additional setup after loading the view.
    18. }
    19. func numberOfSections(in tableView: UITableView) -> Int {
    20. // #warning Incomplete implementation, return the number of sections
    21. return 1
    22. }
    23. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    24. // #warning Incomplete implementation, return the number of rows
    25. print("aaaaaaaa")
    26. print(TableData.count)
    27. return TableData.count
    28. }
    29. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    30. {
    31. //DownloadCell muss im Storyboard angegegen sein
    32. print("asdasdasdsadsaddsadsadsad")
    33. let cell = tableView.dequeueReusableCell(withIdentifier: "DownloadCell", for: indexPath)
    34. cell.textLabel?.text = TableData[indexPath.row].gruppe
    35. return cell
    36. }
    37. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    38. let set = TableData[indexPath.row]
    39. self.TableData.removeAll()
    40. get_data_from_url(test: String(set.id))
    41. self.tableView.reloadData()
    42. print(set)
    43. }
    44. func get_data_from_url(test: String)
    45. {
    46. let url = URL(string: "http://127.0.0.1/Start.php")!
    47. // post the data
    48. var request = URLRequest(url: url)
    49. request.httpMethod = "POST"
    50. let tmpStr = "ID="+String(test)+"&Field2=Field2Data"
    51. let postData = tmpStr.data(using: .utf8)
    52. //let postData = "ID="+String(id)+"&Field2=Field2Data".data(using: .utf8)
    53. request.httpBody = postData
    54. // execute the datatask and validate the result
    55. let task = URLSession.shared.dataTask(with: request) {
    56. (data, response, error) in
    57. //print(data)
    58. if error != nil
    59. {
    60. print("Error")
    61. }
    62. else
    63. {
    64. //print(response)
    65. if let content = data
    66. {
    67. do
    68. {
    69. let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
    70. //self.extract_json(jsonData: myJson as! NSData)
    71. let blogs = myJson["menue"] as? [[String: Any]]
    72. var eintrag: SetMenue = SetMenue(id: 0, gruppe: "", vorgaenger_id: 0, platz_id: "")
    73. eintrag.id = 1
    74. for blog in blogs! {
    75. if let name = blog["ID"] as? String {
    76. //self.TableData.
    77. //self.TableData.append(name)
    78. eintrag.id = Int(name)!
    79. print("xErgebnis" + name)
    80. }
    81. if let name = blog["GRUPPE"] as? String {
    82. //self.TableData.append(name)
    83. eintrag.gruppe = name
    84. print("xErgebnis" + name)
    85. }
    86. self.TableData.append(eintrag)
    87. }
    88. //self.tableView.reloadData()
    89. }
    90. catch
    91. {
    92. }
    93. }
    94. }
    95. }
    96. task.resume()
    97. }
    98. }
    Alles anzeigen
  • Schau mal hier in den zweiten Schritt der Basics: Deine TableView "weiss" noch gar nicht, welches Objekt sie denn nutzen soll, um so Informationen wie die Zeilenanzahl / Sektion zu erhalten. Mit anderen Worten, Du hast ihr noch keine DataSource und keinen Delegate zugewiesen. So werden die von Dir definierten Methoden gar nicht angesprungen...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Vielen Dank MyMattes

    Habe folgendes angepasst

    Quellcode

    1. class OeeChartViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    2. var TableData = [SetMenue]()
    3. override func viewDidLoad() {
    4. super.viewDidLoad()
    5. tableView.delegate = self
    6. tableView.dataSource = self
    7. self.TableData.removeAll()
    8. get_data_from_url(test: "0")
    9. }
    Das blöde ist jetzt nur, dass ich mit der Maus zuerst scrollen muss bis die Daten angezeigt werden, hast du mir da auch noch einen Tipp?
  • TP84 schrieb:

    Das blöde ist jetzt nur, dass ich mit der Maus zuerst scrollen muss bis die Daten angezeigt werden, hast du mir da auch noch einen Tipp?
    Woher soll denn Deine TableView wissen, dass die Methode get_data_from_url (neue) Daten geliefert hat? Du hast den entscheidenen Befehl auskommentiert ... :D

    Mattes

    P.S.: Lies mal genau den von mir benannten Absatz: "The view controller sets the data source and delegate of the table view and sends a reloadData message to it. The data source must adopt the UITableViewDataSource protocol, and the delegate must adopt the UITableViewDelegateprotocol."
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • sorry, hatte nicht den kompletten neuen Code gepostet, in der Funktion ruf ich es aber auf, siehe Zeile 62
    Ändert jedoch nichts an dem Problem

    Quellcode

    1. func get_data_from_url(test: String)
    2. {
    3. let url = URL(string: "http://127.0.0.1/Start.php")!
    4. // post the data
    5. var request = URLRequest(url: url)
    6. request.httpMethod = "POST"
    7. let tmpStr = "ID="+String(test)+"&Field2=Field2Data"
    8. let postData = tmpStr.data(using: .utf8)
    9. //let postData = "ID="+String(id)+"&Field2=Field2Data".data(using: .utf8)
    10. request.httpBody = postData
    11. // execute the datatask and validate the result
    12. let task = URLSession.shared.dataTask(with: request) {
    13. (data, response, error) in
    14. //print(data)
    15. if error != nil
    16. {
    17. print("Error")
    18. }
    19. else
    20. {
    21. //print(response)
    22. if let content = data
    23. {
    24. do
    25. {
    26. let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
    27. //self.extract_json(jsonData: myJson as! NSData)
    28. let blogs = myJson["menue"] as? [[String: Any]]
    29. var eintrag: SetMenue = SetMenue(id: 0, gruppe: "", vorgaenger_id: 0, platz_id: "")
    30. eintrag.id = 1
    31. for blog in blogs! {
    32. if let name = blog["ID"] as? String {
    33. //self.TableData.
    34. //self.TableData.append(name)
    35. eintrag.id = Int(name)!
    36. print("xErgebnis" + name)
    37. }
    38. if let name = blog["GRUPPE"] as? String {
    39. //self.TableData.append(name)
    40. eintrag.gruppe = name
    41. print("xErgebnis" + name)
    42. }
    43. if let name = blog["VORGAENGER_ID"] as? String {
    44. //self.TableData.append(name)
    45. print("xErgebnisxxxxx" + name)
    46. eintrag.vorgaenger_id = Int(name)!
    47. }
    48. if let name = blog["PLATZ_ID"] as? String {
    49. //self.TableData.append(name)
    50. print("xErgebnisaaaa" + name)
    51. if name != nil {
    52. print("Daten gefunden")
    53. }
    54. eintrag.platz_id = name
    55. }
    56. self.TableData.append(eintrag)
    57. }
    58. self.tableView.reloadData()
    59. }
    60. catch
    61. {
    62. }
    63. }
    64. }
    65. }
    66. task.resume()
    67. }
    Alles anzeigen
  • Hm, im Completion-Handler scheint das reloadData() ja zu stehen.

    Ich würde dann auf ein nicht gesetztes tableView Outlet tippen. Da es sich hier jedoch um Swift handelt, sollte die App crashen, wenn der ViewController initialisiert wird und das Outlet nicht gesetzt ist, oder?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()

  • Ich bin auch der Meinung, dass ich das reloadData schon im Completion-Handler ausführe, die UrlSession besitzt ja einen Completion-Handler und in Zeile 33 rufe ich die Funktion ReloadData auf.

    Das Outlet ist auch gesetzt, siehe Screenshot

    Puh schwere Geburt in Swift sich zurecht finden, vor allem wenn man keine Fehlermeldung bekommt.
    Vielleicht hat ja noch wer eine Idee was ich noch versuchen könnte?

    Quellcode

    1. let task = URLSession.shared.dataTask(with: request) {
    2. (data, response, error) in
    3. //print(data)
    4. if error != nil
    5. {
    6. print("Error")
    7. }
    8. else
    9. {
    10. //print(response)
    11. if let content = data
    12. {
    13. do
    14. {
    15. let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
    16. //self.extract_json(jsonData: myJson as! NSData)
    17. let blogs = myJson["menue"] as? [[String: Any]]
    18. var eintrag: SetMenue = SetMenue(id: 0, gruppe: "", vorgaenger_id: 0, platz_id: "")
    19. eintrag.id = 1
    20. for blog in blogs! {
    21. if let name = blog["ID"] as? String {
    22. //self.TableData.
    23. //self.TableData.append(name)
    24. eintrag.id = Int(name)!
    25. print("xErgebnis" + name)
    26. }
    27. self.TableData.append(eintrag)
    28. }
    29. self.tableView.reloadData()
    30. }
    31. catch
    32. {
    33. }
    34. }
    35. }
    36. }
    37. task.resume()
    Alles anzeigen
    Dateien