2015-09-19 14 views
7

Ich verwende Xcode 7.0, Swift 2cellForRowAtIndexPath nicht von benutzerdefinierten Klasse aufgerufen wird

Ich versuche im Grunde eine benutzerdefinierte Klasse zu erstellen, die eine UITable, dann in der ViewController bauen werde ich ein neues Objekt machen von den Tisch und laden Sie es in self.view;

Das Problem, das ich habe, ist, dass die Funktion func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell ist gar nicht von innerhalb der benutzerdefinierten Klasse aufgerufen wird. Ich habe jetzt für 3 Tage nach einer Lösung gesucht, und ich habe versucht, ohne Glück der App und Code mehrmals neu zu erstellen.

Bitte beachten Sie, wenn ich den gleichen Code verwenden (das alles, um die Tabelle erstellen erforderlich ist, ohne init-Funktionen, usw.) in der ViewController.swift Datei, es funktioniert gut.

Ich weiß, dass das Problem mit der cellForRowAtIndexPath Funktion ist, weil es die Anweisung nicht ausdruckt, die ich in diesem Block des Codes einstelle, wenn es ausgeführt wird. Alle anderen Funktionen werden aufgerufen, aber aus irgendeinem Grund wird dies nicht aufgerufen. Ich bin mir nicht sicher, ob ich hier etwas übersehen habe. Jede Hilfe wäre willkommen. Danke im Voraus.

class sideTest: NSObject, UITableViewDelegate, UITableViewDataSource { 


    let tesTable: UITableView = UITableView() 
    var items: [String]? 
    var mView: UIView = UIView() 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     print("The number of rows is: \(self.items!.count)") 

     return self.items!.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     print("\nLets create some cells.") 

     let sCell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell! 

     sCell.textLabel?.text = self.items![indexPath.row] 
     sCell.textLabel?.textColor = UIColor.darkTextColor() 

     return sCell 
    } 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     print("You selected cell #\(indexPath.row)!") 
    } 

    func tblSetup() { 

     self.tesTable.frame = CGRectMake(0, 0, 320, mView.bounds.height) 
     self.tesTable.delegate = self 
     self.tesTable.dataSource = self 

     self.tesTable.backgroundColor = UIColor.cyanColor() 

     // load cells 
     self.tesTable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell") 
     self.tesTable.reloadData() 

     print("Currenlty in tblSetup.\nCurrent rows is: \(self.items!.count)") 
    } 

    //Init 

    override init() { 
     super.init() 

     self.items = nil 

     self.tblSetup() 
    } 

    init(sourceView: UIView , itemListAsArrayString: [String]) { 
     super.init() 

     self.items = itemListAsArrayString 
     self.mView = sourceView 

     self.tblSetup() 
    } 
} 

Hier ist der Code von ViewController.swift; Bitte beachten Sie, dass die Tabelle erstellt wird, aber die Zellen besiedeln nicht, auch wenn ich Zelleninformationen manuell eingeben, indem Sie: sCell.textLabel?.text = "test cell"

class ViewController: UIViewController { 



    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let myTable: sideTest = sideTest(sourceView: self.view, itemListAsArrayString: ["Cell 1", "Cell 2", "Cell 3"]) 
     self.view.addSubview(myTable.tesTable) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

Auch hier ist jede Hilfe sehr dankbar. Vielen Dank.

enter image description here

+0

Sie sollten auf jeden Fall die bestimmte Initialisierung von 'UITableView' verwenden, die' init (frame Rahmen: CGRect, Stil Stil: UITableViewStyle) 'aber ich bin nicht sicher, dass dies den Unterschied machen wird. – Sulthan

+0

Ist Ihre Klasse als Datenquelle der Tabellenansicht festgelegt? – quellish

Antwort

7

Ihr View-Controller hat keinen starken Bezug zu Ihrem sideTest var. Sobald Ihre Ansicht Last tat fertig, Ihre sideTest ist nil.Although Sie haben eine Tableview (von Add subview), aber nicht mehr auf eine Datenquelle haben.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {} 

wird aufgerufen, nachdem die Ansicht geladen wurde. Das verursacht das Problem.

Ihre Ansicht-Controller ändern:

var tb :sideTest? 


override func viewDidLoad() { 
    super.viewDidLoad() 
    let myTable: sideTest = sideTest(sourceView: self.view, itemListAsArrayString: ["Cell 1", "Cell 2", "Cell 3"]) 
    print(myTable.tesTable.frame) 
    tb=myTable 
    self.view.addSubview(myTable.tesTable) 
} 

Änderung Ihrer cellForRowAtIndexPath zu:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    print("create cells") 
    var cell :UITableViewCell? 

    if let sCell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell"){ 
     cell=sCell 

    }else{ 
     cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell") 

    } 


    cell!.textLabel?.text = self.items![indexPath.row] 
    cell!.textLabel?.textColor = UIColor.darkTextColor() 

    return cell! 
} 

dies wird die meisten Probleme zu beheben.

+0

Vielen Dank. Ich hatte nicht einmal über die starke Referenz. Ich schätze es sehr. Das funktionierte wie ein Zauber. Ich kann jetzt weitermachen. YAY! –

+0

Super, für mich wurde auch die Datenquelle nach viewdidload gelöscht – anoop4real

3

Ihr Code:

override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let myTable: sideTest = sideTest(sourceView: self.view, itemListAsArrayString: ["Cell 1", "Cell 2", "Cell 3"]) 
     self.view.addSubview(myTable.tesTable) 
    } 

Ich würde denken, dass die myTable Variable den Gültigkeitsbereich verlässt und freigegeben wird, wenn viewDidLoad abgeschlossen ist, so dass es keine Datenquelle oder delegieren danach. Haben Sie verifiziert, dass die self.view.addSubview(myTable.tesTable) es behält? Versuchen Sie, die Deklaration von myTable außerhalb der Funktionsebene (auf Property-Ebene) zu verschieben oder fügen Sie einen Diagnose-Print zu deinit hinzu.

Verwandte Themen