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

Jos*_*dik 2 xcode interface-builder uitableview ios swift

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

在此处输入图片说明

在此处输入图片说明

在整个应用程序中,该表的所有实例均应具有:

  1. 相同的委托方法
  2. 相同的数据源方法(尽管实际数据将全部更改)
  3. 相同的表格视图单元类型具有相同的出口和动作。
  4. 相同的内部约束(我不想每次都为表单元格手动添加约束)。

现在,我将它们编码为两个单独的视图控制器中的两个单独的表视图,但是,我意识到我将需要在整个应用程序的更多地方复制相同的表和逻辑,这感觉不正确要走的路。所以我的问题是,如何才能以干净,干燥的方式在满足上述规格的iOS中完成表复制(使用界面生成器或swift)?

Kam*_*ski 5

如果要设计一次单元,然后在不同的视图控制器中的不同表视图中使用它们,则必须在单独的.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)
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这两个构建块,您就可以在每个视图控制器上分别布置表格视图,并将其与可重复使用的数据源/代理连接起来。

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此GitHub存储库中找到有关如何查看此内容的基本示例。