2017-08-01 2 views
0

Ich versuche, UITableView Inside UIViewController zu verwenden. Wenn ich es jedoch versuche, gibt es mir einen Fehler, wenn ich die App starte. der Fehler sagt „Methode ant Methode von übergeordneten Klasse überschreiben tut“UITableView in UIViewController

import UIKit 

class GPATableViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 

    struct Objects { 
     var sectionName : String! 
     var sectionObjects : [String]! 
    } 

    var objectsArray = [Objects]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     objectsArray = 
     [Objects(sectionName: "Section1" , sectionObjects: ["","",""]), 
     Objects(sectionName: "Section2" , sectionObjects: ["","",""]), 
     Objects(sectionName: "Section3" , sectionObjects: ["","",""])] 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as UITableViewCell! 
     // cell?.textLabel!.text = objectsArray[indexPath.section].sectionObjects[indexPath.row] 

     print 
     return cell! 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return objectsArray[section].sectionObjects.count 
    } 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     return objectsArray.count 
    } 

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
      return objectsArray[section].sectionName 
    } 

} 

Antwort

1

Wenn Sie die UITableViewDatasource in einem UIViewController implementieren, die Sie überschreiben nicht die Methoden.

Entfernen Sie override von den Methoden, die Ihnen der Compiler sagt.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as UITableViewCell! 
    // cell?.textLabel!.text = objectsArray[indexPath.section].sectionObjects[indexPath.row] 

    print 
    return cell! 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return objectsArray[section].sectionObjects.count 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return objectsArray.count 
} 

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
     return objectsArray[section].sectionName 
} 

HINWEIS: Wenn Sie eine UITableViewController verwendet haben, dann würden Sie die override müssen, was wahrscheinlich ist, was in welcher vorging Datei, die Sie von diesem kopiert.

+0

Thank you so viel, auch Ihre Antwort sehr hilfreich. auch die Anmerkung, die du schreibst, ist hilfreich .. danke nochmal !! – Nawaf

1

Funktionen mit tableView wie numberOfSections(...), cellForRowAt usw. gehören nicht zum UIViewController.

Stattdessen gehören sie zu den UITableViewDelegate und UITableViewDataSource.

Um Ihre Fehler zu beheben, entfernen Sie das Schlüsselwort override vor diesen Funktionen. Sie überschreiben sie nicht, sondern "implementieren" sie auf Anforderung der Protokolle.

Achten Sie darauf, auch den View-Controller als delegate und dataSource, wenn Sie dies in einem Storyboard noch nicht getan haben, gesetzt:

override func viewDidLoad() 
    super.viewDidLoad() 

    // other code... 

    tableView.delegate = self 
    tableView.dataSource = self 

    // other code... 
} 
+0

Vielen Dank. Ihre Antwort ist sehr hilfreich – Nawaf

Verwandte Themen