Как я могу повторно использовать табличное представление в нескольких контроллерах представления в Swift?
Сейчас я работаю над приложением, для которого в моем приложении требуется одно и то же представление таблицы в нескольких сценах, однако данные и расположение таблицы изменятся, как показано на этих двух рисунках (представление таблицы выделено красным цветом).
Во всех случаях таблицы во всем приложении оно должно иметь:
- Те же методы делегата
- Те же методы источника данных (все, хотя фактические данные изменятся)
- В той же таблице отображаются типы ячеек с одинаковыми выходами и действиями.
- Те же внутренние ограничения (я не хочу вручную добавлять ограничения для ячеек таблицы каждый раз).
Прямо сейчас я кодирую их как два отдельных табличных представления в двух отдельных контроллерах представления, однако я понял, что мне нужно будет копировать одну и ту же таблицу и логику во многих других местах моего приложения, и это не кажется правильным путь. Поэтому мой вопрос: как вы можете выполнить чистую и сухую репликацию таблиц в iOS (с помощью построителя интерфейса или swift), которая отвечает спецификациям выше?
1 ответ
Если вы хотите спроектировать ваши ячейки один раз, а затем использовать их в разных табличных представлениях в разных контроллерах представлений, вы должны создать их в отдельных XIB-файлах. Ячейки прототипа соответствуют контроллеру вида и не очень хорошо масштабируются
Если все методы источника данных и делегата совпадают, вы можете перенести реализацию этих протоколов в отдельный класс. Вы можете настроить этот класс с массивом элементов для отображения.
class ReusableTableView: NSObject, UITableViewDataSource, UITableViewDelegate
{
var tableView: UITableView
var tableViewData: [String]
init(_ tv: UITableView, _ data: [String])
{
tableViewData = data
tableView = tv
super.init()
tableView.delegate = self
tableView.dataSource = self
// Register all of your cells
tableView.register(UINib(nibName: "SomeNib", bundle: nil), forCellReuseIdentifier: "example-id")
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tableViewData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return tableView.dequeueReusableCell(withIdentifier: "example-id", for: indexPath)
}
}
Имея эти два стандартных блока, вы можете расположить табличное представление отдельно на каждом контроллере представления и связать его с вашим повторно используемым источником данных / делегатом.
class ExampleTablewViewController: UIViewController
{
@IBOutlet weak var tableView: UITableView!
var reusableTableView: ReusableTableView!
override func viewDidLoad() {
super.viewDidLoad()
reusableTableView = ReusableTableView(tableView, ["lorem", "ipsum", "dolor"])
reusableTableView.tableView.reloadData()
}
}
Вы можете найти базовый пример того, как я вижу это в этом репозитории GitHub.