Как я могу повторно использовать табличное представление в нескольких контроллерах представления в Swift?

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

Во всех случаях таблицы во всем приложении оно должно иметь:

  1. Те же методы делегата
  2. Те же методы источника данных (все, хотя фактические данные изменятся)
  3. В той же таблице отображаются типы ячеек с одинаковыми выходами и действиями.
  4. Те же внутренние ограничения (я не хочу вручную добавлять ограничения для ячеек таблицы каждый раз).

Прямо сейчас я кодирую их как два отдельных табличных представления в двух отдельных контроллерах представления, однако я понял, что мне нужно будет копировать одну и ту же таблицу и логику во многих других местах моего приложения, и это не кажется правильным путь. Поэтому мой вопрос: как вы можете выполнить чистую и сухую репликацию таблиц в 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.

Другие вопросы по тегам