如何在Swift中在多个视图控制器中重用表视图?

5

我现在正在开发一个应用程序,需要在我的应用程序的多个场景中使用完全相同的表格视图,但是数据和表格的位置将会改变,如下面这两张图片所示(表格视图用红色突出显示)

enter image description here

enter image description here

在应用程序中的所有表格实例中,它应该具有:
  1. 相同的委托方法
  2. 相同的数据源方法(尽管实际数据会更改)
  3. 具有相同的表格视图单元格类型,具有相同的输出口和操作。
  4. 相同的内部约束(我不想每次都手动添加表格单元格的约束)。
目前我正在将它们编码为两个单独的表视图,位于两个单独的视图控制器中,但是,我已经意识到我需要在我的应用程序中的许多其他地方复制相同的表格和逻辑,这不像正确的方法。所以我的问题是,如何以干净和DRY的方式在iOS中实现表格复制(使用界面生成器或Swift),以满足上述规格?

{btsdaf} - Kingalione
{btsdaf} - Praveen Kumar
1个回答

10
如果您想设计一次并在不同的视图控制器中的不同表视图中使用它们,您必须在单独的.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仓库中找到我所看到的一个基本示例。


TableViewControl()是什么?它应该是ReusableTableView()吗? - B L
是的,你说得对。应该是 ReusableTableView。我会修正这个错误。 - Kamil Szostakowski
此外,这与自动布局如何协同工作呢?单元格本身是否在.xib文件中,然后您会使用唯一标识符卸载它?我试图想出如何在多个不同的视图控制器中具有特定单元格布局,同时又保持指定的自动布局。谢谢。 - B L
这里不强制要求单元格的可重用性,但出于性能原因强烈建议这样做。您必须在.xib文件中定义单元格(像平常一样使用自动布局),然后使用可重用标识符进行注册。它将像普通的原型单元格一样工作。我在我的答案中链接了示例项目。 - Kamil Szostakowski
数组是值类型,如果您在此处持有一个数组,并且当该数组被修改时,例如,则必须编写单独的代码来更新您在 ReusableTableView 中持有的数组。这意味着您必须维护2个数组,第一个在 VC 中,第二个在 ReusableTableView 中。 - Darshan Mothreja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接