2015-09-19 24 views
7

sto usando Xcode 7.0, Swift 2cellForRowAtIndexPath non viene chiamato da classe personalizzata

praticamente sto cercando di creare una classe personalizzata che costruirà un UITable, poi nel ViewController Faccio un nuovo oggetto di il tavolo e caricarlo in self.view;

Il problema che sto avendo è che la funzione func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell non viene chiamata affatto dalla classe personalizzata. Ho cercato una soluzione per 3 giorni e ho provato a ricostruire l'app e codice diverse volte senza fortuna.

Nota: se utilizzo lo stesso codice (ovvero tutto ciò che è necessario per compilare la tabella, escluse le funzioni di inizializzazione, ecc.) Nel file ViewController.swift, funziona correttamente.

So che il problema è con la funzione cellForRowAtIndexPath perché non stamperà la dichiarazione che ho impostato in quel blocco di codice quando viene eseguito. Vengono chiamate tutte le altre funzioni, ma per qualche motivo questo non viene chiamato. Non sono sicuro di aver trascurato qualcosa qui. Qualsiasi aiuto sarebbe apprezzato. Grazie in anticipo.

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() 
    } 
} 

Ecco il codice di ViewController.swift; Si prega di notare che le tabelle vengono costruito, ma le cellule non popolano, anche se io inserire manualmente informazioni cellule facendo: 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. 
    } 
} 

Ancora una volta, ogni aiuto è molto apprezzato. Grazie.

enter image description here

+0

Si consiglia di utilizzare l'inizializzatore designato di 'UITableView' che è' init (frame frame: CGRect, style style: UITableViewStyle) 'ma non sono sicuro che questo farà la differenza. – Sulthan

+0

La tua classe è impostata come origine dati della vista tabella? – quellish

risposta

7

Il tuo controller di visualizzazione non ha un forte riferimento al tuo sideTest var. Una volta terminata la visualizzazione, il tuo side test è nullo. Anche se hai una vista tabella (aggiungendo una sottoview), ma non hai più un'origine dati.

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

viene chiamato dopo il caricamento della vista. Questo causa il problema.

cambiare il vostro controller della vista a:

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) 
} 

cambiare la vostra cellForRowAtIndexPath a:

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! 
} 

questo risolverà la maggior parte dei problemi.

+0

Grazie mille. Non avevo nemmeno pensato al riferimento forte. Lo apprezzo molto. Questo ha funzionato come un fascino. Ora posso andare avanti. SÌÌ! –

+0

Impressionante, anche per me l'origine dati è stata cancellata dopo il download di vista – anoop4real

3

tuo codice:

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) 
    } 

penserei che la variabile myTable va fuori del campo di applicazione e viene rilasciato quando finisce viewDidLoad, quindi non c'è origine dati o delegato dopo. Hai verificato che lo self.view.addSubview(myTable.tesTable) lo trattiene? Prova a spostare la dichiarazione di myTable al di fuori del livello di funzione (a livello di proprietà) o aggiungi una stampa diagnostica per deinire.

Problemi correlati