Swift 2.2
Этот небольшой урок призван поломать ваш привычный (да и привычный для всех) способ добавления данных в табличные представления. Мы просто отдадим источник данных на аутсорсинг!
Аутсорсинг UITableViewDataSource
Очень распространенный вариант, когда UITableView является не только табличкой, но и источником данных. Это главная причина, по которой View контроллеры становятся огромными. Аутсорсинг источника данных к объекту является лучшим решением.
Давайте рассмотрим пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import UIKit class TableViewController: UITableViewController { private var cartoons = [] // MARK: - UIViewController override func viewDidLoad() { super.viewDidLoad() cartoons = ["South Park", "Spiderman", "Spanch Bob"] tableView.reloadData() } // MARK: - Table view data source override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // #warning Incomplete implementation, return the number of rows return cartoons.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cellIdentifier", forIndexPath: indexPath) as UITableViewCell cell.textLabel?.text = cartoons[indexPath.row] as? String return cell } } |
TableView просто отображает три ячейки с названиями мультфильмов. Тем не менее, вы можете увидеть в этом простом примере, что во View контроллере уже есть лишние строки кода. И со временем он только разрастется.
Но есть лучшее решение. Мы создадим класс под названием DataSource и переместим все методы UITableViewDataSource в этот класс:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import UIKit class DataSource: NSObject, UITableViewDataSource { private var cartoons = [] // MARK: - Table view data source func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // #warning Incomplete implementation, return the number of rows return cartoons.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cellIdentifier", forIndexPath: indexPath) as UITableViewCell cell.textLabel?.text = cartoons[indexPath.row] as? String return cell } } |
Теперь в TableViewController просто необходимо создать экземпляр от класса DataSource и установить его в качестве источника данных TableView:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import UIKit class TableViewController: UITableViewController { private let dataSource = DataSource() // MARK: - UITableViewDataSource override func viewDidLoad() { super.viewDidLoad() tableView.dataSource = dataSource dataSource.cartoons = ["South Park", "Spiderman", "Spanch Bob"] tableView.reloadData() } } |
Контроллер теперь очищен.
Этот метод работает не только в UITableView, но и со всеми View, которые нуждаются в источнике данных. Например, UICollectionView или какой либо View, написанный лично вами.
Скачать пример из этого урока вы можете на нашем Github!
private var cartoons = []
экземпляр датасорса не увидит его, в исходниках кстати без private