2015-09-19 5 views
7

Я использую Xcode 7.0, Swift 2cellForRowAtIndexPath не вызывается из пользовательского класса

Я в основном пытаюсь создать пользовательский класс, который будет строить UITable, то в 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

Вы должны обязательно использовать назначенный инициализатор 'UITableView', который является' init (frame frame: CGRect, style style: UITableViewStyle) ', но я не уверен, что это изменит ситуацию. – Sulthan

+0

Является ли ваш класс установленным как источник данных в виде таблицы? – quellish

ответ

7

Контроллер вашего представления не имеет ссылки на ваш sideTest var. Как только ваше представление загрузилось, ваш sideTest равен nil. Хотя у вас есть табличное представление (путем добавления subview), но у вас больше нет источника данных.

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 – 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 за пределы функционального уровня (до уровня свойства) или добавить диагностическую печать для удаления.

Смежные вопросы