2015-11-03 4 views
0

Я пытаюсь создать простой TableView в Swift, но вместо того, чтобы соответствовать протоколу datasource в моем ViewController, я хотел создать новый класс, который будет служить DataSource. К сожалению, при таком подходе я не могу загрузить что-либо для загрузки в свой ViewController.cellForRowAtIndexPath для TableView не называется?

Это мой ViewController Класс:

class SaladViewController: UIViewController { 

    @IBOutlet weak var saladTable: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 

     let tableData = LunchTableData() 
     self.saladTable.dataSource = tableData 
    } 

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

И это мой DataSource класс:

class LunchTableData: NSObject, UITableViewDataSource { 

    var things = ["One", "Two", "Three"] 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return things.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell") 

     let itemText = cell!.viewWithTag(100) as! UILabel 
     itemText.text = things[indexPath.row] 

     return cell! 
    } 
} 

RowAtIndexPath становится называется тонкой, так что я просто не знаю, почему CellForRowAtIndexPath не всегда называемый. Я установил точку останова, и он никогда не попадает в нее.

Благодарим за помощь!

ответ

4

Я думаю, что таблицаData уничтожена после просмотраDidLoad() завершена.

Итак, переместите следующую строку чуть ниже @IBOutlet weak var saladTable: UITableView! линия.

let tableData = LunchTableData() 

Надеется, что это поможет вам

Так полный код

class SaladViewController: UIViewController { 

    @IBOutlet weak var saladTable: UITableView! 

    let tableData = LunchTableData() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 

     self.saladTable.dataSource = tableData 
    } 

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

Это именно то, что должно быть сделано. Данные таблицы были объявлены как локальная переменная, а это означает, что она уничтожается, когда заканчивается ее область действия, которая в вашем случае является завершением 'viewDidLoad()'. – NRitH

+2

Да, свойство источника данных «слабо». – rmaddy

+0

Вот и все! Спасибо! Забыл о переменных областях ... Кроме того, что означает «слабый» против «сильного» в Свифте? – CPL

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