2015-09-19 1 views
7

カスタムクラスから呼び出されていない私は、私は基本的にUITableを構築するカスタムクラスを作成しようとしているのXcode 7.0、スウィフト2cellForRowAtIndexPathは

を使用しています、そしてViewControllerに私はの新しいオブジェクトを作りますテーブルを読み込み、それをself.viewにロードします。

問題は、カスタムクラス内から関数func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellがまったく呼び出されていないことです。私は今3日間のソリューションを探していましたが、私はアプリケーションとコードを何度も再構築しようとしました。

ViewController.swiftファイルで同じコード(テーブルの作成に必要なものすべて、init関数などを除く)を使用しても問題ありません。

cellForRowAtIndexPath関数で問題があることはわかっています。実行時にそのブロックに設定した文が表示されないためです。他のすべての関数が呼び出されますが、なんらかの理由で呼び出されていません。私はここで何か見落としているかどうかは分かりません。どんな助けもありがとう。前もって感謝します。

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

ここにはViewController.swiftのコードがあります。私は手動で行うことにより、セルの情報を入力した場合でも、テーブルが構築されることを注意しないが、細胞が移入しないでください: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. 
    } 
} 

ここでも、任意のヘルプは大歓迎です。ありがとう。

enter image description here

+0

'init(フレームフレーム:CGRect、スタイルスタイル:UITableViewStyle)'である 'UITableView'の指定された初期化子を使うべきですが、これが違いを生み出すかどうかは分かりません。 – Sulthan

+0

クラスはテーブルビューのデータソースとして設定されていますか? – quellish

答えて

7

あなたのビューコントローラは、あなたのsideTest varへの強い参照を持っていません。 ビューの読み込みが完了したら、sideTestはnilです。サブビューを追加してもテーブルビューがありますが、データソースがなくなりました。

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

はロード後に読み込まれました。それは問題を引き起こします。

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

変更あなたのcellforrowatindexpathを::

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

これが問題のほとんどを解決します

はにあなたのビューコントローラを変更

+0

ありがとうございます。私は強い参照についてもしなかった。ほんとうにありがとう。 これは魅力的に機能しました。私は今に移動することができます。わーい! –

+0

私にとっては、viewdidloadの後にdatasourceもクリアされていました – anoop4real

3

あなたのコード:

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

私はmyTable変数がスコープの外に出るとのviewDidLoadが終了したときに解放されるので、何のデータソースまたは代理人が、その後がないと思うだろう。 self.view.addSubview(myTable.tesTable)がそれを保持していることを確認しましたか?関数レベル(プロパティレベル)の外にmyTableの宣言を移動するか、診断プリントを追加して除外してみてください。