2015-12-19 4 views
3

У меня есть UIViewController, в который я встроил UITableView. Если вы добавили выход в мой класс ViewController.Как использовать внешний источник данных в UITableView

Поскольку я не хочу, чтобы ViewController стал слишком тяжелым, я хотел бы поместить методы протокола UITableViewDataSource и UITableViewDelegate в отдельные классы.

Так что я создал TableViewDataSource.swift и класс TableViewDelegate:

class TableViewDelegate : NSObject, UITableViewDelegate { 
    //custom code here if required 
} 

class TableViewDataSource : NSObject, UITableViewDataSource { 
    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

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

     let cellIdentifier = "MyCellIdentifier" 
     let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) 

     cell.textLabel?.text = "left text" 
     cell.detailTextLabel?.text = "right text" 

     return cell 


    } 


} 

class ViewController: UIViewController { 

    @IBOutlet var tableView: UITableView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.dataSource = TableViewDataSource() 
     tableView.delegate = TableViewDelegate() 

     tableView.setNeedsDisplay() 

     // Do any additional setup after loading the view, typically from a nib. 
    } 
} 

В моей раскадровки, я создал прототип ячейку в Tableview с идентификатором «MyCellIdentifier». Я использую этот идентификатор для создания ячейки в моем методе TableViewDataSource.

Однако, если я запустил приложение, я вижу только пустой tableView. Эти методы даже не вызываются, даже если я установил их в методе viewDidLoad для ViewController. Я также попытался заставить tableView перерисовать, вызвав setNeedsDisplay. Это тоже не повлияло.

enter image description here

+0

Вы действительно не загружаете таблицы – lzl

+0

@lzl Можете ли вы рассказать мне, что делать, чтобы загрузить таблицы? – slashburn

+0

вам нужен фактический источник данных, например массив, а затем используйте содержимое этого – lzl

ответ

5

Вы находитесь на правильном пути, и я полагаю, ваша проблема легко решить. Смотрите здесь:

tableView.dataSource = TableViewDataSource() 
tableView.delegate = TableViewDelegate() 

Это создает новый TableViewDataSource и новый TableViewDelegate и присваивает их dataSource и delegate соответственно. Вот эти свойства на UITableView:

weak public var dataSource: UITableViewDataSource? 
weak public var delegate: UITableViewDelegate? 

Обратите внимание на weak бит? Вы создаете их и назначаете их слабой собственности, поэтому их быстро отбросят.

Ваше решение заключается в создании свойств для этих двух новых объектов внутри вашего контроллера представлений, затем создайте эти свойства в viewDidLoad() и отправьте их в виде таблицы.

+0

Хорошо, теперь я что-то вижу. Но есть что-то еще. Текст rightDetailLabel пуст, даже если я его установил. Интересно, что метка действительно существует, и текст установлен правильно, но что-то не видно. – slashburn

+1

Я рад, что проблема решена! Пожалуйста, отметьте это как правильно, чтобы другие могли его найти. Вы должны действительно задавать новые вопросы как новые вопросы, иначе другие не могут найти их очень легко. (Но прежде чем вы это сделаете, краткий совет: вы проверяли ограничения автоматического макета, чтобы убедиться, что оба края таблицы видны?) – TwoStraws